Merge "Add cancel button to long screenshot UI" into sc-dev
diff --git a/Android.bp b/Android.bp
index 71023bf..c450acf 100644
--- a/Android.bp
+++ b/Android.bp
@@ -104,6 +104,7 @@
":android.security.apc-java-source",
":android.security.authorization-java-source",
":android.security.maintenance-java-source",
+ ":android.security.metrics-java-source",
":android.security.vpnprofilestore-java-source",
":android.system.keystore2-V1-java-source",
":credstore_aidl",
diff --git a/apct-tests/perftests/inputmethod/src/android/inputmethod/ImePerfTest.java b/apct-tests/perftests/inputmethod/src/android/inputmethod/ImePerfTest.java
index 689fb36..21c4491 100644
--- a/apct-tests/perftests/inputmethod/src/android/inputmethod/ImePerfTest.java
+++ b/apct-tests/perftests/inputmethod/src/android/inputmethod/ImePerfTest.java
@@ -18,6 +18,7 @@
import static android.perftests.utils.ManualBenchmarkState.StatsReport;
import static android.perftests.utils.PerfTestActivity.ID_EDITOR;
+import static android.perftests.utils.TestUtils.getOnMainSync;
import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
import static android.view.WindowInsetsAnimation.Callback.DISPATCH_MODE_STOP;
@@ -25,6 +26,7 @@
import static org.junit.Assert.assertTrue;
+import android.annotation.UiThread;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
@@ -64,6 +66,7 @@
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicLong;
import java.util.concurrent.atomic.AtomicReference;
@@ -72,6 +75,7 @@
public class ImePerfTest extends ImePerfTestBase
implements ManualBenchmarkState.CustomizedIterationListener {
private static final String TAG = ImePerfTest.class.getSimpleName();
+ private static final long ANIMATION_NOT_STARTED = -1;
@Rule
public final PerfManualStatusReporter mPerfStatusReporter = new PerfManualStatusReporter();
@@ -304,12 +308,18 @@
latchEnd.set(new CountDownLatch(2));
// For measuring hide, lets show IME first.
if (!show) {
- activity.runOnUiThread(() -> {
- controller.show(WindowInsets.Type.ime());
+ AtomicBoolean showCalled = new AtomicBoolean();
+ getInstrumentation().runOnMainSync(() -> {
+ if (!isImeVisible(activity)) {
+ controller.show(WindowInsets.Type.ime());
+ showCalled.set(true);
+ }
});
- PollingCheck.check("IME show animation should finish ", TIMEOUT_1_S_IN_MS,
- () -> latchStart.get().getCount() == 1
- && latchEnd.get().getCount() == 1);
+ if (showCalled.get()) {
+ PollingCheck.check("IME show animation should finish ", TIMEOUT_1_S_IN_MS,
+ () -> latchStart.get().getCount() == 1
+ && latchEnd.get().getCount() == 1);
+ }
}
if (!mIsTraceStarted && !state.isWarmingUp()) {
startAsyncAtrace();
@@ -317,23 +327,35 @@
}
AtomicLong startTime = new AtomicLong();
- activity.runOnUiThread(() -> {
+ AtomicBoolean unexpectedVisibility = new AtomicBoolean();
+ getInstrumentation().runOnMainSync(() -> {
+ boolean isVisible = isImeVisible(activity);
startTime.set(SystemClock.elapsedRealtimeNanos());
- if (show) {
+
+ if (show && !isVisible) {
controller.show(WindowInsets.Type.ime());
- } else {
+ } else if (!show && isVisible) {
controller.hide(WindowInsets.Type.ime());
+ } else {
+ // ignore this iteration as unexpected IME visibility was encountered.
+ unexpectedVisibility.set(true);
}
});
- measuredTimeNs = waitForAnimationStart(latchStart, startTime);
+ if (!unexpectedVisibility.get()) {
+ long timeElapsed = waitForAnimationStart(latchStart, startTime);
+ if (timeElapsed != ANIMATION_NOT_STARTED) {
+ measuredTimeNs = timeElapsed;
+ }
+ }
// hide IME before next iteration.
if (show) {
activity.runOnUiThread(() -> controller.hide(WindowInsets.Type.ime()));
try {
latchEnd.get().await(TIMEOUT_1_S_IN_MS * 5, TimeUnit.MILLISECONDS);
- if (latchEnd.get().getCount() != 0) {
+ if (latchEnd.get().getCount() != 0
+ && getOnMainSync(() -> isImeVisible(activity))) {
Assert.fail("IME hide animation should finish.");
}
} catch (InterruptedException e) {
@@ -350,12 +372,18 @@
addResultToState(state);
}
+ @UiThread
+ private boolean isImeVisible(@NonNull final Activity activity) {
+ return activity.getWindow().getDecorView().getRootWindowInsets().isVisible(
+ WindowInsets.Type.ime());
+ }
+
private long waitForAnimationStart(
AtomicReference<CountDownLatch> latchStart, AtomicLong startTime) {
try {
latchStart.get().await(TIMEOUT_1_S_IN_MS * 5, TimeUnit.MILLISECONDS);
if (latchStart.get().getCount() != 0) {
- Assert.fail("IME animation should start " + latchStart.get().getCount());
+ return ANIMATION_NOT_STARTED;
}
} catch (InterruptedException e) { }
diff --git a/apct-tests/perftests/utils/src/android/perftests/utils/TestUtils.java b/apct-tests/perftests/utils/src/android/perftests/utils/TestUtils.java
new file mode 100644
index 0000000..d8d3ee3
--- /dev/null
+++ b/apct-tests/perftests/utils/src/android/perftests/utils/TestUtils.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.perftests.utils;
+
+import android.app.Instrumentation;
+
+import androidx.annotation.NonNull;
+import androidx.test.InstrumentationRegistry;
+
+import java.util.concurrent.atomic.AtomicReference;
+import java.util.function.Supplier;
+
+public final class TestUtils {
+
+ /**
+ * Retrieves a value that needs to be obtained on the main thread.
+ *
+ * <p>A simple utility method that helps to return an object from the UI thread.</p>
+ *
+ * @param supplier callback to be called on the UI thread to return a value
+ * @param <T> Type of the value to be returned
+ * @return Value returned from {@code supplier}
+ */
+ public static <T> T getOnMainSync(@NonNull Supplier<T> supplier) {
+ final AtomicReference<T> result = new AtomicReference<>();
+ final Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
+ instrumentation.runOnMainSync(() -> result.set(supplier.get()));
+ return result.get();
+ }
+}
diff --git a/apex/appsearch/Android.bp b/apex/appsearch/Android.bp
index 8278426..ac97e04 100644
--- a/apex/appsearch/Android.bp
+++ b/apex/appsearch/Android.bp
@@ -50,6 +50,20 @@
name: "com.android.appsearch-bootclasspath-fragment",
contents: ["framework-appsearch"],
apex_available: ["com.android.appsearch"],
+
+ // The bootclasspath_fragments that provide APIs on which this depends.
+ fragments: [
+ {
+ apex: "com.android.art",
+ module: "art-bootclasspath-fragment",
+ },
+ ],
+
+ // Additional stubs libraries that this fragment's contents use which are
+ // not provided by another bootclasspath_fragment.
+ additional_stubs: [
+ "android-non-updatable",
+ ],
}
// Encapsulate the contributions made by the com.android.appsearch to the systemserverclasspath.
diff --git a/apex/jobscheduler/framework/java/android/app/AlarmManager.java b/apex/jobscheduler/framework/java/android/app/AlarmManager.java
index 4843415..9c0c365 100644
--- a/apex/jobscheduler/framework/java/android/app/AlarmManager.java
+++ b/apex/jobscheduler/framework/java/android/app/AlarmManager.java
@@ -494,6 +494,9 @@
* exact alarms, rescheduling each time as described above. Legacy applications
* whose {@code targetSdkVersion} is earlier than API 19 will continue to have all
* of their alarms, including repeating alarms, treated as exact.
+ * <p>Apps targeting {@link Build.VERSION_CODES#S} will need to set the flag
+ * {@link PendingIntent#FLAG_MUTABLE} on the {@link PendingIntent} being used to set this alarm,
+ * if they want the alarm count to be supplied with the key {@link Intent#EXTRA_ALARM_COUNT}.
*
* @param type type of alarm.
* @param triggerAtMillis time in milliseconds that the alarm should first
@@ -516,6 +519,7 @@
* @see #ELAPSED_REALTIME_WAKEUP
* @see #RTC
* @see #RTC_WAKEUP
+ * @see Intent#EXTRA_ALARM_COUNT
*/
public void setRepeating(@AlarmType int type, long triggerAtMillis,
long intervalMillis, PendingIntent operation) {
@@ -1004,6 +1008,9 @@
* been available since API 3, your application can safely call it and be
* assured that it will get similar behavior on both current and older versions
* of Android.
+ * <p>Apps targeting {@link Build.VERSION_CODES#S} will need to set the flag
+ * {@link PendingIntent#FLAG_MUTABLE} on the {@link PendingIntent} being used to set this alarm,
+ * if they want the alarm count to be supplied with the key {@link Intent#EXTRA_ALARM_COUNT}.
*
* @param type type of alarm.
* @param triggerAtMillis time in milliseconds that the alarm should first
@@ -1038,6 +1045,7 @@
* @see #INTERVAL_HOUR
* @see #INTERVAL_HALF_DAY
* @see #INTERVAL_DAY
+ * @see Intent#EXTRA_ALARM_COUNT
*/
public void setInexactRepeating(@AlarmType int type, long triggerAtMillis,
long intervalMillis, PendingIntent operation) {
@@ -1286,22 +1294,31 @@
/**
* Called to check if the caller can schedule exact alarms.
+ * Your app schedules exact alarms when it calls any of the {@code setExact...} or
+ * {@link #setAlarmClock(AlarmClockInfo, PendingIntent) setAlarmClock} API methods.
* <p>
- * Apps targeting {@link Build.VERSION_CODES#S} or higher can schedule exact alarms if they
- * have the {@link Manifest.permission#SCHEDULE_EXACT_ALARM} permission. These apps can also
+ * Apps targeting {@link Build.VERSION_CODES#S} or higher can schedule exact alarms only if they
+ * have the {@link Manifest.permission#SCHEDULE_EXACT_ALARM} permission or they are on the
+ * device's power-save exemption list.
+ * These apps can also
* start {@link android.provider.Settings#ACTION_REQUEST_SCHEDULE_EXACT_ALARM} to
- * request this from the user.
+ * request this permission from the user.
* <p>
* Apps targeting lower sdk versions, can always schedule exact alarms.
*
- * @return {@code true} if the caller can schedule exact alarms.
+ * @return {@code true} if the caller can schedule exact alarms, {@code false} otherwise.
* @see android.provider.Settings#ACTION_REQUEST_SCHEDULE_EXACT_ALARM
* @see #setExact(int, long, PendingIntent)
* @see #setExactAndAllowWhileIdle(int, long, PendingIntent)
* @see #setAlarmClock(AlarmClockInfo, PendingIntent)
+ * @see android.os.PowerManager#isIgnoringBatteryOptimizations(String)
*/
public boolean canScheduleExactAlarms() {
- return hasScheduleExactAlarm(mContext.getOpPackageName(), mContext.getUserId());
+ try {
+ return mService.canScheduleExactAlarms(mContext.getOpPackageName());
+ } catch (RemoteException re) {
+ throw re.rethrowFromSystemServer();
+ }
}
/**
diff --git a/apex/jobscheduler/framework/java/android/app/IAlarmManager.aidl b/apex/jobscheduler/framework/java/android/app/IAlarmManager.aidl
index cd7c1e8..9d11ca4 100644
--- a/apex/jobscheduler/framework/java/android/app/IAlarmManager.aidl
+++ b/apex/jobscheduler/framework/java/android/app/IAlarmManager.aidl
@@ -41,6 +41,7 @@
@UnsupportedAppUsage(maxTargetSdk = 30, trackingBug = 170729553)
AlarmManager.AlarmClockInfo getNextAlarmClock(int userId);
long currentNetworkTimeMillis();
+ boolean canScheduleExactAlarms(String packageName);
boolean hasScheduleExactAlarm(String packageName, int userId);
int getConfigVersion();
}
diff --git a/apex/jobscheduler/framework/java/android/os/PowerExemptionManager.java b/apex/jobscheduler/framework/java/android/os/PowerExemptionManager.java
index 42e953b..a1a46af 100644
--- a/apex/jobscheduler/framework/java/android/os/PowerExemptionManager.java
+++ b/apex/jobscheduler/framework/java/android/os/PowerExemptionManager.java
@@ -190,6 +190,8 @@
* @hide
*/
public static final int REASON_TEMP_ALLOWED_WHILE_IN_USE = 70;
+ /** @hide */
+ public static final int REASON_CURRENT_INPUT_METHOD = 71;
/* BG-FGS-launch is allowed by temp-allow-list or system-allow-list.
Reason code for temp and system allow list starts here.
@@ -381,6 +383,7 @@
REASON_ACTIVITY_VISIBILITY_GRACE_PERIOD,
REASON_OP_ACTIVATE_VPN,
REASON_OP_ACTIVATE_PLATFORM_VPN,
+ REASON_CURRENT_INPUT_METHOD,
REASON_TEMP_ALLOWED_WHILE_IN_USE,
// temp and system allow list reasons.
REASON_GEOFENCING,
@@ -649,6 +652,8 @@
return "OP_ACTIVATE_VPN";
case REASON_OP_ACTIVATE_PLATFORM_VPN:
return "OP_ACTIVATE_PLATFORM_VPN";
+ case REASON_CURRENT_INPUT_METHOD:
+ return "CURRENT_INPUT_METHOD";
case REASON_TEMP_ALLOWED_WHILE_IN_USE:
return "TEMP_ALLOWED_WHILE_IN_USE";
case REASON_GEOFENCING:
diff --git a/apex/jobscheduler/framework/java/com/android/server/AppStateTracker.java b/apex/jobscheduler/framework/java/com/android/server/AppStateTracker.java
index 3c89016..b0b9abc 100644
--- a/apex/jobscheduler/framework/java/com/android/server/AppStateTracker.java
+++ b/apex/jobscheduler/framework/java/com/android/server/AppStateTracker.java
@@ -25,29 +25,19 @@
String TAG = "AppStateTracker";
/**
- * Register a {@link ForcedAppStandbyListener} to listen for forced-app-standby changes that
- * should affect services etc.
+ * Register a {@link ServiceStateListener} to listen for forced-app-standby changes that should
+ * affect services.
*/
- void addForcedAppStandbyListener(@NonNull ForcedAppStandbyListener listener);
+ void addServiceStateListener(@NonNull ServiceStateListener listener);
/**
- * @return {code true} if the given UID/package has been in forced app standby mode.
+ * A listener to listen to forced-app-standby changes that should affect services.
*/
- boolean isAppInForcedAppStandby(int uid, @NonNull String packageName);
-
- /**
- * A listener to listen to forced-app-standby changes that should affect services etc.
- */
- interface ForcedAppStandbyListener {
+ interface ServiceStateListener {
/**
- * Called when an app goes in/out of forced app standby.
+ * Called when an app goes into forced app standby and its foreground
+ * services need to be removed from that state.
*/
- void updateForceAppStandbyForUidPackage(int uid, String packageName, boolean standby);
-
- /**
- * Called when all apps' forced-app-standby states need to be re-evaluated, due to
- * enable/disable certain feature flags.
- */
- void updateForcedAppStandbyForAllApps();
+ void stopForegroundServicesForUidPackage(int uid, String packageName);
}
}
diff --git a/apex/jobscheduler/service/java/com/android/server/AppStateTrackerImpl.java b/apex/jobscheduler/service/java/com/android/server/AppStateTrackerImpl.java
index 1deb365..c332a59 100644
--- a/apex/jobscheduler/service/java/com/android/server/AppStateTrackerImpl.java
+++ b/apex/jobscheduler/service/java/com/android/server/AppStateTrackerImpl.java
@@ -60,10 +60,8 @@
import java.io.PrintWriter;
import java.util.Arrays;
-import java.util.Collections;
import java.util.List;
import java.util.Objects;
-import java.util.Set;
/**
* Class to keep track of the information related to "force app standby", which includes:
@@ -162,46 +160,16 @@
@GuardedBy("mLock")
boolean mForcedAppStandbyEnabled;
- /**
- * A lock-free set of (uid, packageName) pairs in forced app standby mode.
- *
- * <p>
- * It's bascially shadowing the {@link #mRunAnyRestrictedPackages} together with
- * the {@link #mForcedAppStandbyEnabled} and the {@link #mForceAllAppsStandby} - mutations on
- * them would result in copy-on-write.
- *
- * Note: when {@link #mForcedAppStandbyEnabled} is {@code false}, it'll be set to an empty set.
- * when {@link #mForceAllAppsStandby} is {@code true}, it'll be set to null;
- * </p>
- */
- volatile Set<Pair<Integer, String>> mForcedAppStandbyUidPackages = Collections.emptySet();
-
@Override
- public void addForcedAppStandbyListener(@NonNull ForcedAppStandbyListener listener) {
+ public void addServiceStateListener(@NonNull ServiceStateListener listener) {
addListener(new Listener() {
@Override
- public void updateForceAppStandbyForUidPackage(int uid, String packageName,
- boolean standby) {
- listener.updateForceAppStandbyForUidPackage(uid, packageName, standby);
- }
-
- @Override
- public void updateForcedAppStandbyForAllApps() {
- listener.updateForcedAppStandbyForAllApps();
+ public void stopForegroundServicesForUidPackage(int uid, String packageName) {
+ listener.stopForegroundServicesForUidPackage(uid, packageName);
}
});
}
- @Override
- public boolean isAppInForcedAppStandby(int uid, @NonNull String packageName) {
- final Set<Pair<Integer, String>> fasUidPkgs = mForcedAppStandbyUidPackages;
- if (fasUidPkgs == null) {
- // Meaning the mForceAllAppsStandby is true.
- return true;
- }
- return fasUidPkgs.contains(Pair.create(uid, packageName));
- }
-
interface Stats {
int UID_FG_STATE_CHANGED = 0;
int UID_ACTIVE_STATE_CHANGED = 1;
@@ -265,7 +233,6 @@
return;
}
mForcedAppStandbyEnabled = enabled;
- updateForcedAppStandbyUidPackagesLocked();
if (DEBUG) {
Slog.d(TAG, "Forced app standby feature flag changed: "
+ mForcedAppStandbyEnabled);
@@ -310,11 +277,7 @@
if (!sender.isRunAnyInBackgroundAppOpsAllowed(uid, packageName)) {
Slog.v(TAG, "Package " + packageName + "/" + uid
+ " toggled into fg service restriction");
- updateForceAppStandbyForUidPackage(uid, packageName, true);
- } else {
- Slog.v(TAG, "Package " + packageName + "/" + uid
- + " toggled out of fg service restriction");
- updateForceAppStandbyForUidPackage(uid, packageName, false);
+ stopForegroundServicesForUidPackage(uid, packageName);
}
}
@@ -379,7 +342,6 @@
private void onForceAllAppsStandbyChanged(AppStateTrackerImpl sender) {
updateAllJobs();
updateAllAlarms();
- updateForcedAppStandbyForAllApps();
}
/**
@@ -404,17 +366,10 @@
}
/**
- * Called when an app goes in/out of forced app standby.
+ * Called when an app goes into forced app standby and its foreground
+ * services need to be removed from that state.
*/
- public void updateForceAppStandbyForUidPackage(int uid, String packageName,
- boolean standby) {
- }
-
- /**
- * Called when all apps' forced-app-standby states need to be re-evaluated due to changes of
- * feature flags such as {@link #mForcedAppStandbyEnabled} or {@link #mForceAllAppsStandby}.
- */
- public void updateForcedAppStandbyForAllApps() {
+ public void stopForegroundServicesForUidPackage(int uid, String packageName) {
}
/**
@@ -483,12 +438,9 @@
final int uid = intent.getIntExtra(Intent.EXTRA_UID, -1);
// No need to notify for state change as all the alarms and jobs should be
// removed too.
- synchronized (mLock) {
- mExemptedBucketPackages.remove(userId, pkgName);
- mRunAnyRestrictedPackages.remove(Pair.create(uid, pkgName));
- updateForcedAppStandbyUidPackagesLocked();
- mActiveUids.delete(uid);
- }
+ mExemptedBucketPackages.remove(userId, pkgName);
+ mRunAnyRestrictedPackages.remove(Pair.create(uid, pkgName));
+ mActiveUids.delete(uid);
}
break;
}
@@ -628,29 +580,6 @@
}
}
}
- updateForcedAppStandbyUidPackagesLocked();
- }
-
- /**
- * Update the {@link #mForcedAppStandbyUidPackages} upon mutations on
- * {@link #mRunAnyRestrictedPackages}, {@link #mForcedAppStandbyEnabled} or
- * {@link #mForceAllAppsStandby}.
- */
- @GuardedBy("mLock")
- private void updateForcedAppStandbyUidPackagesLocked() {
- if (!mForcedAppStandbyEnabled) {
- mForcedAppStandbyUidPackages = Collections.emptySet();
- return;
- }
- if (mForceAllAppsStandby) {
- mForcedAppStandbyUidPackages = null;
- return;
- }
- Set<Pair<Integer, String>> fasUidPkgs = new ArraySet<>();
- for (int i = 0, size = mRunAnyRestrictedPackages.size(); i < size; i++) {
- fasUidPkgs.add(mRunAnyRestrictedPackages.valueAt(i));
- }
- mForcedAppStandbyUidPackages = Collections.unmodifiableSet(fasUidPkgs);
}
private void updateForceAllAppStandbyState() {
@@ -672,7 +601,6 @@
return;
}
mForceAllAppsStandby = enable;
- updateForcedAppStandbyUidPackagesLocked();
mHandler.notifyForceAllAppsStandbyChanged();
}
@@ -717,7 +645,6 @@
} else {
mRunAnyRestrictedPackages.removeAt(index);
}
- updateForcedAppStandbyUidPackagesLocked();
return true;
}
@@ -969,7 +896,6 @@
if (unblockAlarms) {
l.unblockAllUnrestrictedAlarms();
}
- l.updateForcedAppStandbyForAllApps();
}
mStatLogger.logDurationStat(
Stats.FORCE_APP_STANDBY_FEATURE_FLAG_CHANGED, start);
@@ -1040,7 +966,6 @@
mRunAnyRestrictedPackages.removeAt(i);
}
}
- updateForcedAppStandbyUidPackagesLocked();
cleanUpArrayForUser(mActiveUids, removedUserId);
mExemptedBucketPackages.remove(removedUserId);
}
diff --git a/apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java b/apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java
index 70e548d..ed80ddb 100644
--- a/apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java
+++ b/apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java
@@ -1740,7 +1740,7 @@
if (!isExactAlarmChangeEnabled(a.packageName, UserHandle.getUserId(a.uid))) {
return false;
}
- return a.alarmClock != null || !isExemptFromExactAlarmPermission(a.uid);
+ return !isExemptFromExactAlarmPermission(a.uid);
};
removeAlarmsInternalLocked(whichAlarms, REMOVE_REASON_EXACT_PERMISSION_REVOKED);
}
@@ -2414,6 +2414,7 @@
/**
* Returns true if the given uid does not require SCHEDULE_EXACT_ALARM to set exact,
* allow-while-idle alarms.
+ * Note: It is ok to call this method without the lock {@link #mLock} held.
*/
boolean isExemptFromExactAlarmPermission(int uid) {
return (UserHandle.isSameApp(mSystemUiUid, uid)
@@ -2515,7 +2516,7 @@
idleOptions = allowWhileIdle ? mOptsWithFgs.toBundle() : null;
}
if (needsPermission && !hasScheduleExactAlarmInternal(callingPackage, callingUid)) {
- if (alarmClock != null || !isExemptFromExactAlarmPermission(callingUid)) {
+ if (!isExemptFromExactAlarmPermission(callingUid)) {
final String errorMessage = "Caller " + callingPackage + " needs to hold "
+ Manifest.permission.SCHEDULE_EXACT_ALARM + " to set "
+ "exact alarms.";
@@ -2527,10 +2528,16 @@
} else {
allowListed = true;
}
- // If the app is on the full system power allow-list (not except-idle), or we're
- // in a soft failure mode, we still allow the alarms.
- // We give temporary allowlist to allow-while-idle alarms but without FGS
- // capability. Note that apps that are in the power allow-list do not need it.
+ // If the app is on the full system power allow-list (not except-idle), or the
+ // user-elected allow-list, or we're in a soft failure mode, we still allow the
+ // alarms.
+ // In both cases, ALLOW_WHILE_IDLE alarms get a lower quota equivalent to what
+ // pre-S apps got. Note that user-allow-listed apps don't use the flag
+ // ALLOW_WHILE_IDLE.
+ // We grant temporary allow-list to allow-while-idle alarms but without FGS
+ // capability. AlarmClock alarms do not get the temporary allow-list. This is
+ // consistent with pre-S behavior. Note that apps that are in either of the
+ // power-save allow-lists do not need it.
idleOptions = allowWhileIdle ? mOptsWithoutFgs.toBundle() : null;
lowerQuota = allowWhileIdle;
}
@@ -2561,6 +2568,22 @@
}
@Override
+ public boolean canScheduleExactAlarms(String packageName) {
+ final int callingUid = mInjector.getCallingUid();
+ final int userId = UserHandle.getUserId(callingUid);
+ final int packageUid = mPackageManagerInternal.getPackageUid(packageName, 0, userId);
+ if (callingUid != packageUid) {
+ throw new SecurityException("Uid " + callingUid
+ + " cannot query canScheduleExactAlarms for package " + packageName);
+ }
+ if (!isExactAlarmChangeEnabled(packageName, userId)) {
+ return true;
+ }
+ return isExemptFromExactAlarmPermission(packageUid)
+ || hasScheduleExactAlarmInternal(packageName, packageUid);
+ }
+
+ @Override
public boolean hasScheduleExactAlarm(String packageName, int userId) {
final int callingUid = mInjector.getCallingUid();
if (UserHandle.getUserId(callingUid) != userId) {
@@ -2572,9 +2595,6 @@
throw new SecurityException("Uid " + callingUid
+ " cannot query hasScheduleExactAlarm for uid " + uid);
}
- if (!isExactAlarmChangeEnabled(packageName, userId)) {
- return true;
- }
return (uid > 0) ? hasScheduleExactAlarmInternal(packageName, uid) : false;
}
@@ -3577,17 +3597,14 @@
* This is not expected to get called frequently.
*/
void removeExactAlarmsOnPermissionRevokedLocked(int uid, String packageName) {
- Slog.w(TAG, "Package " + packageName + ", uid " + uid + " lost SCHEDULE_EXACT_ALARM!");
- if (!isExactAlarmChangeEnabled(packageName, UserHandle.getUserId(uid))) {
+ if (isExemptFromExactAlarmPermission(uid)
+ || !isExactAlarmChangeEnabled(packageName, UserHandle.getUserId(uid))) {
return;
}
+ Slog.w(TAG, "Package " + packageName + ", uid " + uid + " lost SCHEDULE_EXACT_ALARM!");
- final Predicate<Alarm> whichAlarms = a -> {
- if (a.uid == uid && a.packageName.equals(packageName) && a.windowLength == 0) {
- return a.alarmClock != null || !isExemptFromExactAlarmPermission(uid);
- }
- return false;
- };
+ final Predicate<Alarm> whichAlarms = a -> (a.uid == uid && a.packageName.equals(packageName)
+ && a.windowLength == 0);
removeAlarmsInternalLocked(whichAlarms, REMOVE_REASON_EXACT_PERMISSION_REVOKED);
if (mConstants.KILL_ON_SCHEDULE_EXACT_ALARM_REVOKED) {
diff --git a/boot/hiddenapi/hiddenapi-max-target-o.txt b/boot/hiddenapi/hiddenapi-max-target-o.txt
index 3cc28d9..0ec918b 100644
--- a/boot/hiddenapi/hiddenapi-max-target-o.txt
+++ b/boot/hiddenapi/hiddenapi-max-target-o.txt
@@ -8961,12 +8961,6 @@
Landroid/app/slice/SliceSpec;-><init>(Landroid/os/Parcel;)V
Landroid/app/slice/SliceSpec;->mRevision:I
Landroid/app/slice/SliceSpec;->mType:Ljava/lang/String;
-Landroid/app/StatsManager;-><init>(Landroid/content/Context;)V
-Landroid/app/StatsManager;->DEBUG:Z
-Landroid/app/StatsManager;->getIStatsManagerLocked()Landroid/os/IStatsManager;
-Landroid/app/StatsManager;->mContext:Landroid/content/Context;
-Landroid/app/StatsManager;->mService:Landroid/os/IStatsManager;
-Landroid/app/StatsManager;->TAG:Ljava/lang/String;
Landroid/app/StatusBarManager;->CAMERA_LAUNCH_SOURCE_LIFT_TRIGGER:I
Landroid/app/StatusBarManager;->CAMERA_LAUNCH_SOURCE_POWER_DOUBLE_TAP:I
Landroid/app/StatusBarManager;->CAMERA_LAUNCH_SOURCE_WIGGLE:I
@@ -31618,12 +31612,6 @@
Landroid/media/MediaSession2$CommandButton;->getProvider()Landroid/media/update/MediaSession2Provider$CommandButtonProvider;
Landroid/media/MediaSession2$CommandButton;->isEnabled()Z
Landroid/media/MediaSession2$CommandButton;->mProvider:Landroid/media/update/MediaSession2Provider$CommandButtonProvider;
-Landroid/media/MediaSession2$ControllerInfo;-><init>(Landroid/content/Context;IILjava/lang/String;Landroid/os/IInterface;)V
-Landroid/media/MediaSession2$ControllerInfo;->getPackageName()Ljava/lang/String;
-Landroid/media/MediaSession2$ControllerInfo;->getProvider()Landroid/media/update/MediaSession2Provider$ControllerInfoProvider;
-Landroid/media/MediaSession2$ControllerInfo;->getUid()I
-Landroid/media/MediaSession2$ControllerInfo;->isTrusted()Z
-Landroid/media/MediaSession2$ControllerInfo;->mProvider:Landroid/media/update/MediaSession2Provider$ControllerInfoProvider;
Landroid/media/MediaSession2$OnDataSourceMissingHelper;->onDataSourceMissing(Landroid/media/MediaSession2;Landroid/media/MediaItem2;)Landroid/media/DataSourceDesc;
Landroid/media/MediaSession2$SessionCallback;-><init>()V
Landroid/media/MediaSession2$SessionCallback;->onBufferingStateChanged(Landroid/media/MediaSession2;Landroid/media/MediaPlayerBase;Landroid/media/MediaItem2;I)V
@@ -35339,159 +35327,6 @@
Landroid/mtp/MtpStorageManager;->sDebug:Z
Landroid/mtp/MtpStorageManager;->setSubdirectories(Ljava/util/Set;)V
Landroid/mtp/MtpStorageManager;->TAG:Ljava/lang/String;
-Landroid/net/CaptivePortal;-><init>(Landroid/os/IBinder;)V
-Landroid/net/CaptivePortal;->APP_RETURN_DISMISSED:I
-Landroid/net/CaptivePortal;->APP_RETURN_UNWANTED:I
-Landroid/net/CaptivePortal;->APP_RETURN_WANTED_AS_IS:I
-Landroid/net/CaptivePortal;->mBinder:Landroid/os/IBinder;
-Landroid/net/CaptivePortal;->useNetwork()V
-Landroid/net/ConnectivityManager$CallbackHandler;->DBG:Z
-Landroid/net/ConnectivityManager$CallbackHandler;->getObject(Landroid/os/Message;Ljava/lang/Class;)Ljava/lang/Object;
-Landroid/net/ConnectivityManager$CallbackHandler;->TAG:Ljava/lang/String;
-Landroid/net/ConnectivityManager$Errors;->TOO_MANY_REQUESTS:I
-Landroid/net/ConnectivityManager$LegacyRequest;-><init>()V
-Landroid/net/ConnectivityManager$LegacyRequest;->clearDnsBinding()V
-Landroid/net/ConnectivityManager$LegacyRequest;->currentNetwork:Landroid/net/Network;
-Landroid/net/ConnectivityManager$LegacyRequest;->delay:I
-Landroid/net/ConnectivityManager$LegacyRequest;->expireSequenceNumber:I
-Landroid/net/ConnectivityManager$LegacyRequest;->networkCallback:Landroid/net/ConnectivityManager$NetworkCallback;
-Landroid/net/ConnectivityManager$LegacyRequest;->networkCapabilities:Landroid/net/NetworkCapabilities;
-Landroid/net/ConnectivityManager$LegacyRequest;->networkRequest:Landroid/net/NetworkRequest;
-Landroid/net/ConnectivityManager$NetworkCallback;->networkRequest:Landroid/net/NetworkRequest;
-Landroid/net/ConnectivityManager$NetworkCallback;->onAvailable(Landroid/net/Network;Landroid/net/NetworkCapabilities;Landroid/net/LinkProperties;)V
-Landroid/net/ConnectivityManager$NetworkCallback;->onNetworkResumed(Landroid/net/Network;)V
-Landroid/net/ConnectivityManager$NetworkCallback;->onNetworkSuspended(Landroid/net/Network;)V
-Landroid/net/ConnectivityManager$NetworkCallback;->onPreCheck(Landroid/net/Network;)V
-Landroid/net/ConnectivityManager$PacketKeepalive;->BINDER_DIED:I
-Landroid/net/ConnectivityManager$PacketKeepalive;->ERROR_HARDWARE_ERROR:I
-Landroid/net/ConnectivityManager$PacketKeepalive;->ERROR_HARDWARE_UNSUPPORTED:I
-Landroid/net/ConnectivityManager$PacketKeepalive;->ERROR_INVALID_INTERVAL:I
-Landroid/net/ConnectivityManager$PacketKeepalive;->ERROR_INVALID_IP_ADDRESS:I
-Landroid/net/ConnectivityManager$PacketKeepalive;->ERROR_INVALID_LENGTH:I
-Landroid/net/ConnectivityManager$PacketKeepalive;->ERROR_INVALID_NETWORK:I
-Landroid/net/ConnectivityManager$PacketKeepalive;->ERROR_INVALID_PORT:I
-Landroid/net/ConnectivityManager$PacketKeepalive;->mCallback:Landroid/net/ConnectivityManager$PacketKeepaliveCallback;
-Landroid/net/ConnectivityManager$PacketKeepalive;->MIN_INTERVAL:I
-Landroid/net/ConnectivityManager$PacketKeepalive;->mLooper:Landroid/os/Looper;
-Landroid/net/ConnectivityManager$PacketKeepalive;->mMessenger:Landroid/os/Messenger;
-Landroid/net/ConnectivityManager$PacketKeepalive;->mNetwork:Landroid/net/Network;
-Landroid/net/ConnectivityManager$PacketKeepalive;->mSlot:Ljava/lang/Integer;
-Landroid/net/ConnectivityManager$PacketKeepalive;->NATT_PORT:I
-Landroid/net/ConnectivityManager$PacketKeepalive;->NO_KEEPALIVE:I
-Landroid/net/ConnectivityManager$PacketKeepalive;->stopLooper()V
-Landroid/net/ConnectivityManager$PacketKeepalive;->SUCCESS:I
-Landroid/net/ConnectivityManager$PacketKeepalive;->TAG:Ljava/lang/String;
-Landroid/net/ConnectivityManager$TooManyRequestsException;-><init>()V
-Landroid/net/ConnectivityManager;-><init>(Landroid/content/Context;Landroid/net/IConnectivityManager;)V
-Landroid/net/ConnectivityManager;->ACTION_CAPTIVE_PORTAL_TEST_COMPLETED:Ljava/lang/String;
-Landroid/net/ConnectivityManager;->ACTION_DATA_ACTIVITY_CHANGE:Ljava/lang/String;
-Landroid/net/ConnectivityManager;->ACTION_PROMPT_LOST_VALIDATION:Ljava/lang/String;
-Landroid/net/ConnectivityManager;->ACTION_PROMPT_UNVALIDATED:Ljava/lang/String;
-Landroid/net/ConnectivityManager;->ALREADY_UNREGISTERED:Landroid/net/NetworkRequest;
-Landroid/net/ConnectivityManager;->BASE:I
-Landroid/net/ConnectivityManager;->CALLBACK_AVAILABLE:I
-Landroid/net/ConnectivityManager;->CALLBACK_CAP_CHANGED:I
-Landroid/net/ConnectivityManager;->CALLBACK_IP_CHANGED:I
-Landroid/net/ConnectivityManager;->CALLBACK_LOSING:I
-Landroid/net/ConnectivityManager;->CALLBACK_LOST:I
-Landroid/net/ConnectivityManager;->CALLBACK_PRECHECK:I
-Landroid/net/ConnectivityManager;->CALLBACK_RESUMED:I
-Landroid/net/ConnectivityManager;->CALLBACK_SUSPENDED:I
-Landroid/net/ConnectivityManager;->CALLBACK_UNAVAIL:I
-Landroid/net/ConnectivityManager;->checkCallbackNotNull(Landroid/net/ConnectivityManager$NetworkCallback;)V
-Landroid/net/ConnectivityManager;->checkLegacyRoutingApiAccess()V
-Landroid/net/ConnectivityManager;->checkMobileProvisioning(I)I
-Landroid/net/ConnectivityManager;->checkPendingIntentNotNull(Landroid/app/PendingIntent;)V
-Landroid/net/ConnectivityManager;->checkTimeout(I)V
-Landroid/net/ConnectivityManager;->CONNECTIVITY_ACTION_SUPL:Ljava/lang/String;
-Landroid/net/ConnectivityManager;->convertServiceException(Landroid/os/ServiceSpecificException;)Ljava/lang/RuntimeException;
-Landroid/net/ConnectivityManager;->enforceChangePermission(Landroid/content/Context;)V
-Landroid/net/ConnectivityManager;->enforceTetherChangePermission(Landroid/content/Context;Ljava/lang/String;)V
-Landroid/net/ConnectivityManager;->expireRequest(Landroid/net/NetworkCapabilities;I)V
-Landroid/net/ConnectivityManager;->EXPIRE_LEGACY_REQUEST:I
-Landroid/net/ConnectivityManager;->EXTRA_ACTIVE_LOCAL_ONLY:Ljava/lang/String;
-Landroid/net/ConnectivityManager;->EXTRA_ADD_TETHER_TYPE:Ljava/lang/String;
-Landroid/net/ConnectivityManager;->EXTRA_CAPTIVE_PORTAL_PROBE_SPEC:Ljava/lang/String;
-Landroid/net/ConnectivityManager;->EXTRA_CAPTIVE_PORTAL_USER_AGENT:Ljava/lang/String;
-Landroid/net/ConnectivityManager;->EXTRA_DEVICE_TYPE:Ljava/lang/String;
-Landroid/net/ConnectivityManager;->EXTRA_INET_CONDITION:Ljava/lang/String;
-Landroid/net/ConnectivityManager;->EXTRA_IS_ACTIVE:Ljava/lang/String;
-Landroid/net/ConnectivityManager;->EXTRA_IS_CAPTIVE_PORTAL:Ljava/lang/String;
-Landroid/net/ConnectivityManager;->EXTRA_PROVISION_CALLBACK:Ljava/lang/String;
-Landroid/net/ConnectivityManager;->EXTRA_REALTIME_NS:Ljava/lang/String;
-Landroid/net/ConnectivityManager;->EXTRA_REM_TETHER_TYPE:Ljava/lang/String;
-Landroid/net/ConnectivityManager;->EXTRA_RUN_PROVISION:Ljava/lang/String;
-Landroid/net/ConnectivityManager;->EXTRA_SET_ALARM:Ljava/lang/String;
-Landroid/net/ConnectivityManager;->factoryReset()V
-Landroid/net/ConnectivityManager;->findRequestForFeature(Landroid/net/NetworkCapabilities;)Landroid/net/NetworkRequest;
-Landroid/net/ConnectivityManager;->getActiveNetworkForUid(I)Landroid/net/Network;
-Landroid/net/ConnectivityManager;->getActiveNetworkForUid(IZ)Landroid/net/Network;
-Landroid/net/ConnectivityManager;->getActiveNetworkInfoForUid(IZ)Landroid/net/NetworkInfo;
-Landroid/net/ConnectivityManager;->getAlwaysOnVpnPackageForUser(I)Ljava/lang/String;
-Landroid/net/ConnectivityManager;->getCallbackName(I)Ljava/lang/String;
-Landroid/net/ConnectivityManager;->getDefaultHandler()Landroid/net/ConnectivityManager$CallbackHandler;
-Landroid/net/ConnectivityManager;->getGlobalProxy()Landroid/net/ProxyInfo;
-Landroid/net/ConnectivityManager;->getInstanceOrNull()Landroid/net/ConnectivityManager;
-Landroid/net/ConnectivityManager;->getMobileProvisioningUrl()Ljava/lang/String;
-Landroid/net/ConnectivityManager;->getNetworkInfoForUid(Landroid/net/Network;IZ)Landroid/net/NetworkInfo;
-Landroid/net/ConnectivityManager;->getNetworkManagementService()Landroid/os/INetworkManagementService;
-Landroid/net/ConnectivityManager;->getNetworkPolicyManager()Landroid/net/INetworkPolicyManager;
-Landroid/net/ConnectivityManager;->getProxyForNetwork(Landroid/net/Network;)Landroid/net/ProxyInfo;
-Landroid/net/ConnectivityManager;->getTetheredDhcpRanges()[Ljava/lang/String;
-Landroid/net/ConnectivityManager;->inferLegacyTypeForNetworkCapabilities(Landroid/net/NetworkCapabilities;)I
-Landroid/net/ConnectivityManager;->isAlwaysOnVpnPackageSupportedForUser(ILjava/lang/String;)Z
-Landroid/net/ConnectivityManager;->isNetworkTypeWifi(I)Z
-Landroid/net/ConnectivityManager;->legacyTypeForNetworkCapabilities(Landroid/net/NetworkCapabilities;)I
-Landroid/net/ConnectivityManager;->LISTEN:I
-Landroid/net/ConnectivityManager;->MAX_NETWORK_TYPE:I
-Landroid/net/ConnectivityManager;->MAX_RADIO_TYPE:I
-Landroid/net/ConnectivityManager;->mContext:Landroid/content/Context;
-Landroid/net/ConnectivityManager;->MIN_NETWORK_TYPE:I
-Landroid/net/ConnectivityManager;->mNetworkActivityListeners:Landroid/util/ArrayMap;
-Landroid/net/ConnectivityManager;->mNMService:Landroid/os/INetworkManagementService;
-Landroid/net/ConnectivityManager;->mNPManager:Landroid/net/INetworkPolicyManager;
-Landroid/net/ConnectivityManager;->MULTIPATH_PREFERENCE_UNMETERED:I
-Landroid/net/ConnectivityManager;->NETID_UNSET:I
-Landroid/net/ConnectivityManager;->networkCapabilitiesForType(I)Landroid/net/NetworkCapabilities;
-Landroid/net/ConnectivityManager;->PRIVATE_DNS_DEFAULT_MODE_FALLBACK:Ljava/lang/String;
-Landroid/net/ConnectivityManager;->PRIVATE_DNS_MODE_OFF:Ljava/lang/String;
-Landroid/net/ConnectivityManager;->PRIVATE_DNS_MODE_OPPORTUNISTIC:Ljava/lang/String;
-Landroid/net/ConnectivityManager;->PRIVATE_DNS_MODE_PROVIDER_HOSTNAME:Ljava/lang/String;
-Landroid/net/ConnectivityManager;->registerNetworkAgent(Landroid/os/Messenger;Landroid/net/NetworkInfo;Landroid/net/LinkProperties;Landroid/net/NetworkCapabilities;ILandroid/net/NetworkMisc;)I
-Landroid/net/ConnectivityManager;->renewRequestLocked(Landroid/net/ConnectivityManager$LegacyRequest;)V
-Landroid/net/ConnectivityManager;->reportInetCondition(II)V
-Landroid/net/ConnectivityManager;->REQUEST:I
-Landroid/net/ConnectivityManager;->requestNetwork(Landroid/net/NetworkRequest;Landroid/net/ConnectivityManager$NetworkCallback;IILandroid/os/Handler;)V
-Landroid/net/ConnectivityManager;->REQUEST_ID_UNSET:I
-Landroid/net/ConnectivityManager;->sCallbackHandler:Landroid/net/ConnectivityManager$CallbackHandler;
-Landroid/net/ConnectivityManager;->sCallbacks:Ljava/util/HashMap;
-Landroid/net/ConnectivityManager;->sendExpireMsgForFeature(Landroid/net/NetworkCapabilities;II)V
-Landroid/net/ConnectivityManager;->sendRequestForNetwork(Landroid/net/NetworkCapabilities;Landroid/net/ConnectivityManager$NetworkCallback;IIILandroid/net/ConnectivityManager$CallbackHandler;)Landroid/net/NetworkRequest;
-Landroid/net/ConnectivityManager;->setAcceptUnvalidated(Landroid/net/Network;ZZ)V
-Landroid/net/ConnectivityManager;->setAlwaysOnVpnPackageForUser(ILjava/lang/String;Z)Z
-Landroid/net/ConnectivityManager;->setAvoidUnvalidated(Landroid/net/Network;)V
-Landroid/net/ConnectivityManager;->setGlobalProxy(Landroid/net/ProxyInfo;)V
-Landroid/net/ConnectivityManager;->setProvisioningNotificationVisible(ZILjava/lang/String;)V
-Landroid/net/ConnectivityManager;->sInstance:Landroid/net/ConnectivityManager;
-Landroid/net/ConnectivityManager;->sLegacyTypeToCapability:Landroid/util/SparseIntArray;
-Landroid/net/ConnectivityManager;->sLegacyTypeToTransport:Landroid/util/SparseIntArray;
-Landroid/net/ConnectivityManager;->startCaptivePortalApp(Landroid/net/Network;)V
-Landroid/net/ConnectivityManager;->TAG:Ljava/lang/String;
-Landroid/net/ConnectivityManager;->TETHERING_INVALID:I
-Landroid/net/ConnectivityManager;->TETHER_ERROR_DISABLE_NAT_ERROR:I
-Landroid/net/ConnectivityManager;->TETHER_ERROR_ENABLE_NAT_ERROR:I
-Landroid/net/ConnectivityManager;->TETHER_ERROR_IFACE_CFG_ERROR:I
-Landroid/net/ConnectivityManager;->TETHER_ERROR_MASTER_ERROR:I
-Landroid/net/ConnectivityManager;->TETHER_ERROR_NO_ERROR:I
-Landroid/net/ConnectivityManager;->TETHER_ERROR_PROVISION_FAILED:I
-Landroid/net/ConnectivityManager;->TETHER_ERROR_SERVICE_UNAVAIL:I
-Landroid/net/ConnectivityManager;->TETHER_ERROR_TETHER_IFACE_ERROR:I
-Landroid/net/ConnectivityManager;->TETHER_ERROR_UNAVAIL_IFACE:I
-Landroid/net/ConnectivityManager;->TETHER_ERROR_UNKNOWN_IFACE:I
-Landroid/net/ConnectivityManager;->TETHER_ERROR_UNSUPPORTED:I
-Landroid/net/ConnectivityManager;->TETHER_ERROR_UNTETHER_IFACE_ERROR:I
-Landroid/net/ConnectivityManager;->unsupportedStartingFrom(I)V
-Landroid/net/ConnectivityManager;->updateLockdownVpn()Z
Landroid/net/ConnectivityMetricsEvent;-><init>()V
Landroid/net/ConnectivityMetricsEvent;-><init>(Landroid/os/Parcel;)V
Landroid/net/ConnectivityMetricsEvent;->CREATOR:Landroid/os/Parcelable$Creator;
@@ -35500,12 +35335,6 @@
Landroid/net/ConnectivityMetricsEvent;->netId:I
Landroid/net/ConnectivityMetricsEvent;->timestamp:J
Landroid/net/ConnectivityMetricsEvent;->transports:J
-Landroid/net/ConnectivityThread$Singleton;-><init>()V
-Landroid/net/ConnectivityThread$Singleton;->INSTANCE:Landroid/net/ConnectivityThread;
-Landroid/net/ConnectivityThread;-><init>()V
-Landroid/net/ConnectivityThread;->createInstance()Landroid/net/ConnectivityThread;
-Landroid/net/ConnectivityThread;->get()Landroid/net/ConnectivityThread;
-Landroid/net/ConnectivityThread;->getInstanceLooper()Landroid/os/Looper;
Landroid/net/Credentials;->gid:I
Landroid/net/Credentials;->pid:I
Landroid/net/Credentials;->uid:I
@@ -35516,9 +35345,6 @@
Landroid/net/DataUsageRequest;->REQUEST_ID_UNSET:I
Landroid/net/DataUsageRequest;->template:Landroid/net/NetworkTemplate;
Landroid/net/DataUsageRequest;->thresholdInBytes:J
-Landroid/net/DhcpInfo;-><init>(Landroid/net/DhcpInfo;)V
-Landroid/net/DhcpInfo;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/net/DhcpInfo;->putAddress(Ljava/lang/StringBuffer;I)V
Landroid/net/DhcpResults;->addDns(Ljava/lang/String;)Z
Landroid/net/DhcpResults;->clear()V
Landroid/net/DhcpResults;->CREATOR:Landroid/os/Parcelable$Creator;
@@ -35572,224 +35398,6 @@
Landroid/net/http/X509TrustManagerExtensions;->mDelegate:Lcom/android/org/conscrypt/TrustManagerImpl;
Landroid/net/http/X509TrustManagerExtensions;->mIsSameTrustConfiguration:Ljava/lang/reflect/Method;
Landroid/net/http/X509TrustManagerExtensions;->mTrustManager:Ljavax/net/ssl/X509TrustManager;
-Landroid/net/ICaptivePortal$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/net/ICaptivePortal$Stub$Proxy;->appResponse(I)V
-Landroid/net/ICaptivePortal$Stub$Proxy;->getInterfaceDescriptor()Ljava/lang/String;
-Landroid/net/ICaptivePortal$Stub$Proxy;->mRemote:Landroid/os/IBinder;
-Landroid/net/ICaptivePortal$Stub;-><init>()V
-Landroid/net/ICaptivePortal$Stub;->asInterface(Landroid/os/IBinder;)Landroid/net/ICaptivePortal;
-Landroid/net/ICaptivePortal$Stub;->DESCRIPTOR:Ljava/lang/String;
-Landroid/net/ICaptivePortal$Stub;->TRANSACTION_appResponse:I
-Landroid/net/ICaptivePortal;->appResponse(I)V
-Landroid/net/IConnectivityManager$Stub$Proxy;->addVpnAddress(Ljava/lang/String;I)Z
-Landroid/net/IConnectivityManager$Stub$Proxy;->checkMobileProvisioning(I)I
-Landroid/net/IConnectivityManager$Stub$Proxy;->establishVpn(Lcom/android/internal/net/VpnConfig;)Landroid/os/ParcelFileDescriptor;
-Landroid/net/IConnectivityManager$Stub$Proxy;->factoryReset()V
-Landroid/net/IConnectivityManager$Stub$Proxy;->getActiveNetwork()Landroid/net/Network;
-Landroid/net/IConnectivityManager$Stub$Proxy;->getActiveNetworkForUid(IZ)Landroid/net/Network;
-Landroid/net/IConnectivityManager$Stub$Proxy;->getActiveNetworkInfoForUid(IZ)Landroid/net/NetworkInfo;
-Landroid/net/IConnectivityManager$Stub$Proxy;->getActiveNetworkQuotaInfo()Landroid/net/NetworkQuotaInfo;
-Landroid/net/IConnectivityManager$Stub$Proxy;->getAllNetworkState()[Landroid/net/NetworkState;
-Landroid/net/IConnectivityManager$Stub$Proxy;->getAllVpnInfo()[Lcom/android/internal/net/VpnInfo;
-Landroid/net/IConnectivityManager$Stub$Proxy;->getAlwaysOnVpnPackage(I)Ljava/lang/String;
-Landroid/net/IConnectivityManager$Stub$Proxy;->getCaptivePortalServerUrl()Ljava/lang/String;
-Landroid/net/IConnectivityManager$Stub$Proxy;->getDefaultNetworkCapabilitiesForUser(I)[Landroid/net/NetworkCapabilities;
-Landroid/net/IConnectivityManager$Stub$Proxy;->getGlobalProxy()Landroid/net/ProxyInfo;
-Landroid/net/IConnectivityManager$Stub$Proxy;->getInterfaceDescriptor()Ljava/lang/String;
-Landroid/net/IConnectivityManager$Stub$Proxy;->getLastTetherError(Ljava/lang/String;)I
-Landroid/net/IConnectivityManager$Stub$Proxy;->getLegacyVpnInfo(I)Lcom/android/internal/net/LegacyVpnInfo;
-Landroid/net/IConnectivityManager$Stub$Proxy;->getLinkProperties(Landroid/net/Network;)Landroid/net/LinkProperties;
-Landroid/net/IConnectivityManager$Stub$Proxy;->getLinkPropertiesForType(I)Landroid/net/LinkProperties;
-Landroid/net/IConnectivityManager$Stub$Proxy;->getMobileProvisioningUrl()Ljava/lang/String;
-Landroid/net/IConnectivityManager$Stub$Proxy;->getMultipathPreference(Landroid/net/Network;)I
-Landroid/net/IConnectivityManager$Stub$Proxy;->getNetworkCapabilities(Landroid/net/Network;)Landroid/net/NetworkCapabilities;
-Landroid/net/IConnectivityManager$Stub$Proxy;->getNetworkForType(I)Landroid/net/Network;
-Landroid/net/IConnectivityManager$Stub$Proxy;->getNetworkInfo(I)Landroid/net/NetworkInfo;
-Landroid/net/IConnectivityManager$Stub$Proxy;->getNetworkInfoForUid(Landroid/net/Network;IZ)Landroid/net/NetworkInfo;
-Landroid/net/IConnectivityManager$Stub$Proxy;->getNetworkWatchlistConfigHash()[B
-Landroid/net/IConnectivityManager$Stub$Proxy;->getProxyForNetwork(Landroid/net/Network;)Landroid/net/ProxyInfo;
-Landroid/net/IConnectivityManager$Stub$Proxy;->getRestoreDefaultNetworkDelay(I)I
-Landroid/net/IConnectivityManager$Stub$Proxy;->getTetherableBluetoothRegexs()[Ljava/lang/String;
-Landroid/net/IConnectivityManager$Stub$Proxy;->getTetherableWifiRegexs()[Ljava/lang/String;
-Landroid/net/IConnectivityManager$Stub$Proxy;->getTetheredDhcpRanges()[Ljava/lang/String;
-Landroid/net/IConnectivityManager$Stub$Proxy;->getTetheringErroredIfaces()[Ljava/lang/String;
-Landroid/net/IConnectivityManager$Stub$Proxy;->getVpnConfig(I)Lcom/android/internal/net/VpnConfig;
-Landroid/net/IConnectivityManager$Stub$Proxy;->isActiveNetworkMetered()Z
-Landroid/net/IConnectivityManager$Stub$Proxy;->isAlwaysOnVpnPackageSupported(ILjava/lang/String;)Z
-Landroid/net/IConnectivityManager$Stub$Proxy;->isNetworkSupported(I)Z
-Landroid/net/IConnectivityManager$Stub$Proxy;->isTetheringSupported(Ljava/lang/String;)Z
-Landroid/net/IConnectivityManager$Stub$Proxy;->listenForNetwork(Landroid/net/NetworkCapabilities;Landroid/os/Messenger;Landroid/os/IBinder;)Landroid/net/NetworkRequest;
-Landroid/net/IConnectivityManager$Stub$Proxy;->pendingListenForNetwork(Landroid/net/NetworkCapabilities;Landroid/app/PendingIntent;)V
-Landroid/net/IConnectivityManager$Stub$Proxy;->pendingRequestForNetwork(Landroid/net/NetworkCapabilities;Landroid/app/PendingIntent;)Landroid/net/NetworkRequest;
-Landroid/net/IConnectivityManager$Stub$Proxy;->prepareVpn(Ljava/lang/String;Ljava/lang/String;I)Z
-Landroid/net/IConnectivityManager$Stub$Proxy;->registerNetworkAgent(Landroid/os/Messenger;Landroid/net/NetworkInfo;Landroid/net/LinkProperties;Landroid/net/NetworkCapabilities;ILandroid/net/NetworkMisc;)I
-Landroid/net/IConnectivityManager$Stub$Proxy;->registerNetworkFactory(Landroid/os/Messenger;Ljava/lang/String;)V
-Landroid/net/IConnectivityManager$Stub$Proxy;->releaseNetworkRequest(Landroid/net/NetworkRequest;)V
-Landroid/net/IConnectivityManager$Stub$Proxy;->releasePendingNetworkRequest(Landroid/app/PendingIntent;)V
-Landroid/net/IConnectivityManager$Stub$Proxy;->removeVpnAddress(Ljava/lang/String;I)Z
-Landroid/net/IConnectivityManager$Stub$Proxy;->reportInetCondition(II)V
-Landroid/net/IConnectivityManager$Stub$Proxy;->reportNetworkConnectivity(Landroid/net/Network;Z)V
-Landroid/net/IConnectivityManager$Stub$Proxy;->requestBandwidthUpdate(Landroid/net/Network;)Z
-Landroid/net/IConnectivityManager$Stub$Proxy;->requestNetwork(Landroid/net/NetworkCapabilities;Landroid/os/Messenger;ILandroid/os/IBinder;I)Landroid/net/NetworkRequest;
-Landroid/net/IConnectivityManager$Stub$Proxy;->requestRouteToHostAddress(I[B)Z
-Landroid/net/IConnectivityManager$Stub$Proxy;->setAcceptUnvalidated(Landroid/net/Network;ZZ)V
-Landroid/net/IConnectivityManager$Stub$Proxy;->setAirplaneMode(Z)V
-Landroid/net/IConnectivityManager$Stub$Proxy;->setAlwaysOnVpnPackage(ILjava/lang/String;Z)Z
-Landroid/net/IConnectivityManager$Stub$Proxy;->setAvoidUnvalidated(Landroid/net/Network;)V
-Landroid/net/IConnectivityManager$Stub$Proxy;->setGlobalProxy(Landroid/net/ProxyInfo;)V
-Landroid/net/IConnectivityManager$Stub$Proxy;->setProvisioningNotificationVisible(ZILjava/lang/String;)V
-Landroid/net/IConnectivityManager$Stub$Proxy;->setUnderlyingNetworksForVpn([Landroid/net/Network;)Z
-Landroid/net/IConnectivityManager$Stub$Proxy;->setUsbTethering(ZLjava/lang/String;)I
-Landroid/net/IConnectivityManager$Stub$Proxy;->setVpnPackageAuthorization(Ljava/lang/String;IZ)V
-Landroid/net/IConnectivityManager$Stub$Proxy;->startCaptivePortalApp(Landroid/net/Network;)V
-Landroid/net/IConnectivityManager$Stub$Proxy;->startLegacyVpn(Lcom/android/internal/net/VpnProfile;)V
-Landroid/net/IConnectivityManager$Stub$Proxy;->startNattKeepalive(Landroid/net/Network;ILandroid/os/Messenger;Landroid/os/IBinder;Ljava/lang/String;ILjava/lang/String;)V
-Landroid/net/IConnectivityManager$Stub$Proxy;->startTethering(ILandroid/os/ResultReceiver;ZLjava/lang/String;)V
-Landroid/net/IConnectivityManager$Stub$Proxy;->stopKeepalive(Landroid/net/Network;I)V
-Landroid/net/IConnectivityManager$Stub$Proxy;->stopTethering(ILjava/lang/String;)V
-Landroid/net/IConnectivityManager$Stub$Proxy;->tether(Ljava/lang/String;Ljava/lang/String;)I
-Landroid/net/IConnectivityManager$Stub$Proxy;->unregisterNetworkFactory(Landroid/os/Messenger;)V
-Landroid/net/IConnectivityManager$Stub$Proxy;->untether(Ljava/lang/String;Ljava/lang/String;)I
-Landroid/net/IConnectivityManager$Stub$Proxy;->updateLockdownVpn()Z
-Landroid/net/IConnectivityManager$Stub;->DESCRIPTOR:Ljava/lang/String;
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_addVpnAddress:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_checkMobileProvisioning:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_establishVpn:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_factoryReset:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_getActiveLinkProperties:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_getActiveNetwork:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_getActiveNetworkForUid:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_getActiveNetworkInfo:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_getActiveNetworkInfoForUid:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_getActiveNetworkQuotaInfo:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_getAllNetworkInfo:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_getAllNetworks:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_getAllNetworkState:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_getAllVpnInfo:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_getAlwaysOnVpnPackage:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_getCaptivePortalServerUrl:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_getDefaultNetworkCapabilitiesForUser:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_getGlobalProxy:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_getLastTetherError:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_getLegacyVpnInfo:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_getLinkProperties:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_getLinkPropertiesForType:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_getMobileProvisioningUrl:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_getMultipathPreference:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_getNetworkCapabilities:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_getNetworkForType:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_getNetworkInfo:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_getNetworkInfoForUid:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_getNetworkWatchlistConfigHash:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_getProxyForNetwork:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_getRestoreDefaultNetworkDelay:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_getTetherableBluetoothRegexs:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_getTetherableIfaces:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_getTetherableUsbRegexs:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_getTetherableWifiRegexs:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_getTetheredDhcpRanges:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_getTetheredIfaces:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_getTetheringErroredIfaces:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_getVpnConfig:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_isActiveNetworkMetered:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_isAlwaysOnVpnPackageSupported:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_isNetworkSupported:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_isTetheringSupported:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_listenForNetwork:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_pendingListenForNetwork:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_pendingRequestForNetwork:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_prepareVpn:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_registerNetworkAgent:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_registerNetworkFactory:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_releaseNetworkRequest:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_releasePendingNetworkRequest:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_removeVpnAddress:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_reportInetCondition:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_reportNetworkConnectivity:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_requestBandwidthUpdate:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_requestNetwork:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_requestRouteToHostAddress:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_setAcceptUnvalidated:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_setAirplaneMode:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_setAlwaysOnVpnPackage:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_setAvoidUnvalidated:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_setGlobalProxy:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_setProvisioningNotificationVisible:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_setUnderlyingNetworksForVpn:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_setUsbTethering:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_setVpnPackageAuthorization:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_startCaptivePortalApp:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_startLegacyVpn:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_startNattKeepalive:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_startTethering:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_stopKeepalive:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_stopTethering:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_tether:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_unregisterNetworkFactory:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_untether:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_updateLockdownVpn:I
-Landroid/net/IConnectivityManager;->addVpnAddress(Ljava/lang/String;I)Z
-Landroid/net/IConnectivityManager;->checkMobileProvisioning(I)I
-Landroid/net/IConnectivityManager;->establishVpn(Lcom/android/internal/net/VpnConfig;)Landroid/os/ParcelFileDescriptor;
-Landroid/net/IConnectivityManager;->factoryReset()V
-Landroid/net/IConnectivityManager;->getActiveNetwork()Landroid/net/Network;
-Landroid/net/IConnectivityManager;->getActiveNetworkForUid(IZ)Landroid/net/Network;
-Landroid/net/IConnectivityManager;->getActiveNetworkInfoForUid(IZ)Landroid/net/NetworkInfo;
-Landroid/net/IConnectivityManager;->getActiveNetworkQuotaInfo()Landroid/net/NetworkQuotaInfo;
-Landroid/net/IConnectivityManager;->getAllNetworks()[Landroid/net/Network;
-Landroid/net/IConnectivityManager;->getAllVpnInfo()[Lcom/android/internal/net/VpnInfo;
-Landroid/net/IConnectivityManager;->getAlwaysOnVpnPackage(I)Ljava/lang/String;
-Landroid/net/IConnectivityManager;->getCaptivePortalServerUrl()Ljava/lang/String;
-Landroid/net/IConnectivityManager;->getDefaultNetworkCapabilitiesForUser(I)[Landroid/net/NetworkCapabilities;
-Landroid/net/IConnectivityManager;->getGlobalProxy()Landroid/net/ProxyInfo;
-Landroid/net/IConnectivityManager;->getLegacyVpnInfo(I)Lcom/android/internal/net/LegacyVpnInfo;
-Landroid/net/IConnectivityManager;->getLinkProperties(Landroid/net/Network;)Landroid/net/LinkProperties;
-Landroid/net/IConnectivityManager;->getLinkPropertiesForType(I)Landroid/net/LinkProperties;
-Landroid/net/IConnectivityManager;->getMobileProvisioningUrl()Ljava/lang/String;
-Landroid/net/IConnectivityManager;->getMultipathPreference(Landroid/net/Network;)I
-Landroid/net/IConnectivityManager;->getNetworkCapabilities(Landroid/net/Network;)Landroid/net/NetworkCapabilities;
-Landroid/net/IConnectivityManager;->getNetworkForType(I)Landroid/net/Network;
-Landroid/net/IConnectivityManager;->getNetworkInfoForUid(Landroid/net/Network;IZ)Landroid/net/NetworkInfo;
-Landroid/net/IConnectivityManager;->getNetworkWatchlistConfigHash()[B
-Landroid/net/IConnectivityManager;->getProxyForNetwork(Landroid/net/Network;)Landroid/net/ProxyInfo;
-Landroid/net/IConnectivityManager;->getRestoreDefaultNetworkDelay(I)I
-Landroid/net/IConnectivityManager;->getTetherableBluetoothRegexs()[Ljava/lang/String;
-Landroid/net/IConnectivityManager;->getTetheredDhcpRanges()[Ljava/lang/String;
-Landroid/net/IConnectivityManager;->getVpnConfig(I)Lcom/android/internal/net/VpnConfig;
-Landroid/net/IConnectivityManager;->isActiveNetworkMetered()Z
-Landroid/net/IConnectivityManager;->isAlwaysOnVpnPackageSupported(ILjava/lang/String;)Z
-Landroid/net/IConnectivityManager;->isNetworkSupported(I)Z
-Landroid/net/IConnectivityManager;->isTetheringSupported(Ljava/lang/String;)Z
-Landroid/net/IConnectivityManager;->listenForNetwork(Landroid/net/NetworkCapabilities;Landroid/os/Messenger;Landroid/os/IBinder;)Landroid/net/NetworkRequest;
-Landroid/net/IConnectivityManager;->pendingListenForNetwork(Landroid/net/NetworkCapabilities;Landroid/app/PendingIntent;)V
-Landroid/net/IConnectivityManager;->pendingRequestForNetwork(Landroid/net/NetworkCapabilities;Landroid/app/PendingIntent;)Landroid/net/NetworkRequest;
-Landroid/net/IConnectivityManager;->prepareVpn(Ljava/lang/String;Ljava/lang/String;I)Z
-Landroid/net/IConnectivityManager;->registerNetworkAgent(Landroid/os/Messenger;Landroid/net/NetworkInfo;Landroid/net/LinkProperties;Landroid/net/NetworkCapabilities;ILandroid/net/NetworkMisc;)I
-Landroid/net/IConnectivityManager;->registerNetworkFactory(Landroid/os/Messenger;Ljava/lang/String;)V
-Landroid/net/IConnectivityManager;->releaseNetworkRequest(Landroid/net/NetworkRequest;)V
-Landroid/net/IConnectivityManager;->releasePendingNetworkRequest(Landroid/app/PendingIntent;)V
-Landroid/net/IConnectivityManager;->removeVpnAddress(Ljava/lang/String;I)Z
-Landroid/net/IConnectivityManager;->reportNetworkConnectivity(Landroid/net/Network;Z)V
-Landroid/net/IConnectivityManager;->requestBandwidthUpdate(Landroid/net/Network;)Z
-Landroid/net/IConnectivityManager;->requestNetwork(Landroid/net/NetworkCapabilities;Landroid/os/Messenger;ILandroid/os/IBinder;I)Landroid/net/NetworkRequest;
-Landroid/net/IConnectivityManager;->requestRouteToHostAddress(I[B)Z
-Landroid/net/IConnectivityManager;->setAcceptUnvalidated(Landroid/net/Network;ZZ)V
-Landroid/net/IConnectivityManager;->setAlwaysOnVpnPackage(ILjava/lang/String;Z)Z
-Landroid/net/IConnectivityManager;->setAvoidUnvalidated(Landroid/net/Network;)V
-Landroid/net/IConnectivityManager;->setGlobalProxy(Landroid/net/ProxyInfo;)V
-Landroid/net/IConnectivityManager;->setProvisioningNotificationVisible(ZILjava/lang/String;)V
-Landroid/net/IConnectivityManager;->setUnderlyingNetworksForVpn([Landroid/net/Network;)Z
-Landroid/net/IConnectivityManager;->setUsbTethering(ZLjava/lang/String;)I
-Landroid/net/IConnectivityManager;->setVpnPackageAuthorization(Ljava/lang/String;IZ)V
-Landroid/net/IConnectivityManager;->startCaptivePortalApp(Landroid/net/Network;)V
-Landroid/net/IConnectivityManager;->startNattKeepalive(Landroid/net/Network;ILandroid/os/Messenger;Landroid/os/IBinder;Ljava/lang/String;ILjava/lang/String;)V
-Landroid/net/IConnectivityManager;->startTethering(ILandroid/os/ResultReceiver;ZLjava/lang/String;)V
-Landroid/net/IConnectivityManager;->stopKeepalive(Landroid/net/Network;I)V
-Landroid/net/IConnectivityManager;->stopTethering(ILjava/lang/String;)V
-Landroid/net/IConnectivityManager;->tether(Ljava/lang/String;Ljava/lang/String;)I
-Landroid/net/IConnectivityManager;->unregisterNetworkFactory(Landroid/os/Messenger;)V
-Landroid/net/IConnectivityManager;->untether(Ljava/lang/String;Ljava/lang/String;)I
-Landroid/net/IConnectivityManager;->updateLockdownVpn()Z
Landroid/net/IEthernetManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
Landroid/net/IEthernetManager$Stub$Proxy;->addListener(Landroid/net/IEthernetServiceListener;)V
Landroid/net/IEthernetManager$Stub$Proxy;->getAvailableInterfaces()[Ljava/lang/String;
@@ -36306,41 +35914,6 @@
Landroid/net/InterfaceConfiguration;->mHwAddr:Ljava/lang/String;
Landroid/net/InterfaceConfiguration;->setHardwareAddress(Ljava/lang/String;)V
Landroid/net/InterfaceConfiguration;->validateFlag(Ljava/lang/String;)V
-Landroid/net/IpConfiguration$IpAssignment;->DHCP:Landroid/net/IpConfiguration$IpAssignment;
-Landroid/net/IpConfiguration$IpAssignment;->UNASSIGNED:Landroid/net/IpConfiguration$IpAssignment;
-Landroid/net/IpConfiguration$IpAssignment;->valueOf(Ljava/lang/String;)Landroid/net/IpConfiguration$IpAssignment;
-Landroid/net/IpConfiguration$IpAssignment;->values()[Landroid/net/IpConfiguration$IpAssignment;
-Landroid/net/IpConfiguration$ProxySettings;->PAC:Landroid/net/IpConfiguration$ProxySettings;
-Landroid/net/IpConfiguration$ProxySettings;->STATIC:Landroid/net/IpConfiguration$ProxySettings;
-Landroid/net/IpConfiguration$ProxySettings;->UNASSIGNED:Landroid/net/IpConfiguration$ProxySettings;
-Landroid/net/IpConfiguration$ProxySettings;->valueOf(Ljava/lang/String;)Landroid/net/IpConfiguration$ProxySettings;
-Landroid/net/IpConfiguration$ProxySettings;->values()[Landroid/net/IpConfiguration$ProxySettings;
-Landroid/net/IpConfiguration;-><init>()V
-Landroid/net/IpConfiguration;-><init>(Landroid/net/IpConfiguration;)V
-Landroid/net/IpConfiguration;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/net/IpConfiguration;->getHttpProxy()Landroid/net/ProxyInfo;
-Landroid/net/IpConfiguration;->getIpAssignment()Landroid/net/IpConfiguration$IpAssignment;
-Landroid/net/IpConfiguration;->getProxySettings()Landroid/net/IpConfiguration$ProxySettings;
-Landroid/net/IpConfiguration;->getStaticIpConfiguration()Landroid/net/StaticIpConfiguration;
-Landroid/net/IpConfiguration;->init(Landroid/net/IpConfiguration$IpAssignment;Landroid/net/IpConfiguration$ProxySettings;Landroid/net/StaticIpConfiguration;Landroid/net/ProxyInfo;)V
-Landroid/net/IpConfiguration;->ipAssignment:Landroid/net/IpConfiguration$IpAssignment;
-Landroid/net/IpConfiguration;->proxySettings:Landroid/net/IpConfiguration$ProxySettings;
-Landroid/net/IpConfiguration;->setHttpProxy(Landroid/net/ProxyInfo;)V
-Landroid/net/IpConfiguration;->setIpAssignment(Landroid/net/IpConfiguration$IpAssignment;)V
-Landroid/net/IpConfiguration;->setProxySettings(Landroid/net/IpConfiguration$ProxySettings;)V
-Landroid/net/IpConfiguration;->setStaticIpConfiguration(Landroid/net/StaticIpConfiguration;)V
-Landroid/net/IpConfiguration;->staticIpConfiguration:Landroid/net/StaticIpConfiguration;
-Landroid/net/IpConfiguration;->TAG:Ljava/lang/String;
-Landroid/net/IpPrefix;-><init>(Ljava/lang/String;)V
-Landroid/net/IpPrefix;-><init>(Ljava/net/InetAddress;I)V
-Landroid/net/IpPrefix;-><init>([BI)V
-Landroid/net/IpPrefix;->address:[B
-Landroid/net/IpPrefix;->checkAndMaskAddressAndPrefixLength()V
-Landroid/net/IpPrefix;->containsPrefix(Landroid/net/IpPrefix;)Z
-Landroid/net/IpPrefix;->isIPv4()Z
-Landroid/net/IpPrefix;->isIPv6()Z
-Landroid/net/IpPrefix;->lengthComparator()Ljava/util/Comparator;
-Landroid/net/IpPrefix;->prefixLength:I
Landroid/net/IpSecAlgorithm;->checkValidOrThrow(Ljava/lang/String;II)V
Landroid/net/IpSecAlgorithm;->CRYPT_NULL:Ljava/lang/String;
Landroid/net/IpSecAlgorithm;->equals(Landroid/net/IpSecAlgorithm;Landroid/net/IpSecAlgorithm;)Z
@@ -36522,73 +36095,6 @@
Landroid/net/ITetheringStatsProvider;->getTetherStats(I)Landroid/net/NetworkStats;
Landroid/net/ITetheringStatsProvider;->QUOTA_UNLIMITED:I
Landroid/net/ITetheringStatsProvider;->setInterfaceQuota(Ljava/lang/String;J)V
-Landroid/net/KeepalivePacketData$InvalidPacketException;-><init>(I)V
-Landroid/net/KeepalivePacketData$InvalidPacketException;->error:I
-Landroid/net/KeepalivePacketData;-><init>(Landroid/os/Parcel;)V
-Landroid/net/KeepalivePacketData;-><init>(Ljava/net/InetAddress;ILjava/net/InetAddress;I[B)V
-Landroid/net/KeepalivePacketData;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/net/KeepalivePacketData;->dstAddress:Ljava/net/InetAddress;
-Landroid/net/KeepalivePacketData;->dstPort:I
-Landroid/net/KeepalivePacketData;->getPacket()[B
-Landroid/net/KeepalivePacketData;->IPV4_HEADER_LENGTH:I
-Landroid/net/KeepalivePacketData;->mPacket:[B
-Landroid/net/KeepalivePacketData;->nattKeepalivePacket(Ljava/net/InetAddress;ILjava/net/InetAddress;I)Landroid/net/KeepalivePacketData;
-Landroid/net/KeepalivePacketData;->srcAddress:Ljava/net/InetAddress;
-Landroid/net/KeepalivePacketData;->srcPort:I
-Landroid/net/KeepalivePacketData;->TAG:Ljava/lang/String;
-Landroid/net/KeepalivePacketData;->UDP_HEADER_LENGTH:I
-Landroid/net/LinkAddress;-><init>(Ljava/lang/String;II)V
-Landroid/net/LinkAddress;-><init>(Ljava/net/InetAddress;III)V
-Landroid/net/LinkAddress;-><init>(Ljava/net/InterfaceAddress;)V
-Landroid/net/LinkAddress;->flags:I
-Landroid/net/LinkAddress;->init(Ljava/net/InetAddress;III)V
-Landroid/net/LinkAddress;->isGlobalPreferred()Z
-Landroid/net/LinkAddress;->isIPv4()Z
-Landroid/net/LinkAddress;->isIPv6ULA()Z
-Landroid/net/LinkAddress;->scope:I
-Landroid/net/LinkAddress;->scopeForUnicastAddress(Ljava/net/InetAddress;)I
-Landroid/net/LinkProperties$CompareResult;-><init>()V
-Landroid/net/LinkProperties$CompareResult;-><init>(Ljava/util/Collection;Ljava/util/Collection;)V
-Landroid/net/LinkProperties$CompareResult;->added:Ljava/util/List;
-Landroid/net/LinkProperties$CompareResult;->removed:Ljava/util/List;
-Landroid/net/LinkProperties$ProvisioningChange;->valueOf(Ljava/lang/String;)Landroid/net/LinkProperties$ProvisioningChange;
-Landroid/net/LinkProperties;->addValidatedPrivateDnsServer(Ljava/net/InetAddress;)Z
-Landroid/net/LinkProperties;->compareAddresses(Landroid/net/LinkProperties;)Landroid/net/LinkProperties$CompareResult;
-Landroid/net/LinkProperties;->compareAllInterfaceNames(Landroid/net/LinkProperties;)Landroid/net/LinkProperties$CompareResult;
-Landroid/net/LinkProperties;->compareAllRoutes(Landroid/net/LinkProperties;)Landroid/net/LinkProperties$CompareResult;
-Landroid/net/LinkProperties;->compareDnses(Landroid/net/LinkProperties;)Landroid/net/LinkProperties$CompareResult;
-Landroid/net/LinkProperties;->compareValidatedPrivateDnses(Landroid/net/LinkProperties;)Landroid/net/LinkProperties$CompareResult;
-Landroid/net/LinkProperties;->ensureDirectlyConnectedRoutes()V
-Landroid/net/LinkProperties;->findLinkAddressIndex(Landroid/net/LinkAddress;)I
-Landroid/net/LinkProperties;->getValidatedPrivateDnsServers()Ljava/util/List;
-Landroid/net/LinkProperties;->hasIPv4AddressOnInterface(Ljava/lang/String;)Z
-Landroid/net/LinkProperties;->isIdenticalMtu(Landroid/net/LinkProperties;)Z
-Landroid/net/LinkProperties;->isIdenticalPrivateDns(Landroid/net/LinkProperties;)Z
-Landroid/net/LinkProperties;->isIdenticalTcpBufferSizes(Landroid/net/LinkProperties;)Z
-Landroid/net/LinkProperties;->isIdenticalValidatedPrivateDnses(Landroid/net/LinkProperties;)Z
-Landroid/net/LinkProperties;->isIPv4Provisioned()Z
-Landroid/net/LinkProperties;->isValidMtu(IZ)Z
-Landroid/net/LinkProperties;->MAX_MTU:I
-Landroid/net/LinkProperties;->mDnses:Ljava/util/ArrayList;
-Landroid/net/LinkProperties;->mDomains:Ljava/lang/String;
-Landroid/net/LinkProperties;->mHttpProxy:Landroid/net/ProxyInfo;
-Landroid/net/LinkProperties;->MIN_MTU:I
-Landroid/net/LinkProperties;->MIN_MTU_V6:I
-Landroid/net/LinkProperties;->mLinkAddresses:Ljava/util/ArrayList;
-Landroid/net/LinkProperties;->mMtu:I
-Landroid/net/LinkProperties;->mPrivateDnsServerName:Ljava/lang/String;
-Landroid/net/LinkProperties;->mRoutes:Ljava/util/ArrayList;
-Landroid/net/LinkProperties;->mStackedLinks:Ljava/util/Hashtable;
-Landroid/net/LinkProperties;->mTcpBufferSizes:Ljava/lang/String;
-Landroid/net/LinkProperties;->mUsePrivateDns:Z
-Landroid/net/LinkProperties;->mValidatedPrivateDnses:Ljava/util/ArrayList;
-Landroid/net/LinkProperties;->removeLinkAddress(Landroid/net/LinkAddress;)Z
-Landroid/net/LinkProperties;->removeStackedLink(Ljava/lang/String;)Z
-Landroid/net/LinkProperties;->removeValidatedPrivateDnsServer(Ljava/net/InetAddress;)Z
-Landroid/net/LinkProperties;->routeWithInterface(Landroid/net/RouteInfo;)Landroid/net/RouteInfo;
-Landroid/net/LinkProperties;->setPrivateDnsServerName(Ljava/lang/String;)V
-Landroid/net/LinkProperties;->setUsePrivateDns(Z)V
-Landroid/net/LinkProperties;->setValidatedPrivateDnsServers(Ljava/util/Collection;)V
Landroid/net/LinkQualityInfo;-><init>()V
Landroid/net/LinkQualityInfo;->CREATOR:Landroid/os/Parcelable$Creator;
Landroid/net/LinkQualityInfo;->getDataSampleDuration()I
@@ -36677,29 +36183,6 @@
Landroid/net/LocalSocketImpl;->writeba_native([BIILjava/io/FileDescriptor;)V
Landroid/net/LocalSocketImpl;->writeMonitor:Ljava/lang/Object;
Landroid/net/LocalSocketImpl;->write_native(ILjava/io/FileDescriptor;)V
-Landroid/net/MacAddress;-><init>(J)V
-Landroid/net/MacAddress;->BASE_GOOGLE_MAC:Landroid/net/MacAddress;
-Landroid/net/MacAddress;->byteAddrFromLongAddr(J)[B
-Landroid/net/MacAddress;->byteAddrFromStringAddr(Ljava/lang/String;)[B
-Landroid/net/MacAddress;->createRandomUnicastAddress()Landroid/net/MacAddress;
-Landroid/net/MacAddress;->createRandomUnicastAddress(Landroid/net/MacAddress;Ljava/util/Random;)Landroid/net/MacAddress;
-Landroid/net/MacAddress;->createRandomUnicastAddressWithGoogleBase()Landroid/net/MacAddress;
-Landroid/net/MacAddress;->ETHER_ADDR_BROADCAST:[B
-Landroid/net/MacAddress;->ETHER_ADDR_LEN:I
-Landroid/net/MacAddress;->isMacAddress([B)Z
-Landroid/net/MacAddress;->isMulticastAddress()Z
-Landroid/net/MacAddress;->LOCALLY_ASSIGNED_MASK:J
-Landroid/net/MacAddress;->longAddrFromByteAddr([B)J
-Landroid/net/MacAddress;->longAddrFromStringAddr(Ljava/lang/String;)J
-Landroid/net/MacAddress;->macAddressType([B)I
-Landroid/net/MacAddress;->mAddr:J
-Landroid/net/MacAddress;->MULTICAST_MASK:J
-Landroid/net/MacAddress;->NIC_MASK:J
-Landroid/net/MacAddress;->OUI_MASK:J
-Landroid/net/MacAddress;->stringAddrFromByteAddr([B)Ljava/lang/String;
-Landroid/net/MacAddress;->stringAddrFromLongAddr(J)Ljava/lang/String;
-Landroid/net/MacAddress;->TYPE_UNKNOWN:I
-Landroid/net/MacAddress;->VALID_LONG_MASK:J
Landroid/net/MailTo;-><init>()V
Landroid/net/MailTo;->BODY:Ljava/lang/String;
Landroid/net/MailTo;->CC:Ljava/lang/String;
@@ -36958,666 +36441,6 @@
Landroid/net/MobileLinkQualityInfo;->mLteSignalStrength:I
Landroid/net/MobileLinkQualityInfo;->mMobileNetworkType:I
Landroid/net/MobileLinkQualityInfo;->mRssi:I
-Landroid/net/Network$NetworkBoundSocketFactory;->connectToHost(Ljava/lang/String;ILjava/net/SocketAddress;)Ljava/net/Socket;
-Landroid/net/Network$NetworkBoundSocketFactory;->mNetId:I
-Landroid/net/Network;-><init>(Landroid/net/Network;)V
-Landroid/net/Network;->getNetIdForResolv()I
-Landroid/net/Network;->HANDLE_MAGIC:J
-Landroid/net/Network;->HANDLE_MAGIC_SIZE:I
-Landroid/net/Network;->httpKeepAlive:Z
-Landroid/net/Network;->httpKeepAliveDurationMs:J
-Landroid/net/Network;->httpMaxConnections:I
-Landroid/net/Network;->maybeInitUrlConnectionFactory()V
-Landroid/net/Network;->mLock:Ljava/lang/Object;
-Landroid/net/Network;->mNetworkBoundSocketFactory:Landroid/net/Network$NetworkBoundSocketFactory;
-Landroid/net/Network;->mPrivateDnsBypass:Z
-Landroid/net/Network;->mUrlConnectionFactory:Lcom/android/okhttp/internalandroidapi/HttpURLConnectionFactory;
-Landroid/net/Network;->setPrivateDnsBypass(Z)V
-Landroid/net/Network;->writeToProto(Landroid/util/proto/ProtoOutputStream;J)V
-Landroid/net/NetworkAgent;-><init>(Landroid/os/Looper;Landroid/content/Context;Ljava/lang/String;Landroid/net/NetworkInfo;Landroid/net/NetworkCapabilities;Landroid/net/LinkProperties;I)V
-Landroid/net/NetworkAgent;-><init>(Landroid/os/Looper;Landroid/content/Context;Ljava/lang/String;Landroid/net/NetworkInfo;Landroid/net/NetworkCapabilities;Landroid/net/LinkProperties;ILandroid/net/NetworkMisc;)V
-Landroid/net/NetworkAgent;->BASE:I
-Landroid/net/NetworkAgent;->BW_REFRESH_MIN_WIN_MS:J
-Landroid/net/NetworkAgent;->CMD_PREVENT_AUTOMATIC_RECONNECT:I
-Landroid/net/NetworkAgent;->CMD_REPORT_NETWORK_STATUS:I
-Landroid/net/NetworkAgent;->CMD_REQUEST_BANDWIDTH_UPDATE:I
-Landroid/net/NetworkAgent;->CMD_SAVE_ACCEPT_UNVALIDATED:I
-Landroid/net/NetworkAgent;->CMD_SET_SIGNAL_STRENGTH_THRESHOLDS:I
-Landroid/net/NetworkAgent;->CMD_START_PACKET_KEEPALIVE:I
-Landroid/net/NetworkAgent;->CMD_STOP_PACKET_KEEPALIVE:I
-Landroid/net/NetworkAgent;->CMD_SUSPECT_BAD:I
-Landroid/net/NetworkAgent;->DBG:Z
-Landroid/net/NetworkAgent;->EVENT_NETWORK_CAPABILITIES_CHANGED:I
-Landroid/net/NetworkAgent;->EVENT_NETWORK_INFO_CHANGED:I
-Landroid/net/NetworkAgent;->EVENT_NETWORK_PROPERTIES_CHANGED:I
-Landroid/net/NetworkAgent;->EVENT_NETWORK_SCORE_CHANGED:I
-Landroid/net/NetworkAgent;->EVENT_PACKET_KEEPALIVE:I
-Landroid/net/NetworkAgent;->EVENT_SET_EXPLICITLY_SELECTED:I
-Landroid/net/NetworkAgent;->explicitlySelected(Z)V
-Landroid/net/NetworkAgent;->INVALID_NETWORK:I
-Landroid/net/NetworkAgent;->log(Ljava/lang/String;)V
-Landroid/net/NetworkAgent;->LOG_TAG:Ljava/lang/String;
-Landroid/net/NetworkAgent;->mAsyncChannel:Lcom/android/internal/util/AsyncChannel;
-Landroid/net/NetworkAgent;->mContext:Landroid/content/Context;
-Landroid/net/NetworkAgent;->mLastBwRefreshTime:J
-Landroid/net/NetworkAgent;->mPollLcePending:Ljava/util/concurrent/atomic/AtomicBoolean;
-Landroid/net/NetworkAgent;->mPollLceScheduled:Z
-Landroid/net/NetworkAgent;->mPreConnectedQueue:Ljava/util/ArrayList;
-Landroid/net/NetworkAgent;->netId:I
-Landroid/net/NetworkAgent;->networkStatus(ILjava/lang/String;)V
-Landroid/net/NetworkAgent;->onPacketKeepaliveEvent(II)V
-Landroid/net/NetworkAgent;->pollLceData()V
-Landroid/net/NetworkAgent;->preventAutomaticReconnect()V
-Landroid/net/NetworkAgent;->queueOrSendMessage(III)V
-Landroid/net/NetworkAgent;->queueOrSendMessage(IIILjava/lang/Object;)V
-Landroid/net/NetworkAgent;->queueOrSendMessage(ILjava/lang/Object;)V
-Landroid/net/NetworkAgent;->queueOrSendMessage(Landroid/os/Message;)V
-Landroid/net/NetworkAgent;->REDIRECT_URL_KEY:Ljava/lang/String;
-Landroid/net/NetworkAgent;->saveAcceptUnvalidated(Z)V
-Landroid/net/NetworkAgent;->sendLinkProperties(Landroid/net/LinkProperties;)V
-Landroid/net/NetworkAgent;->sendNetworkCapabilities(Landroid/net/NetworkCapabilities;)V
-Landroid/net/NetworkAgent;->sendNetworkScore(I)V
-Landroid/net/NetworkAgent;->setSignalStrengthThresholds([I)V
-Landroid/net/NetworkAgent;->startPacketKeepalive(Landroid/os/Message;)V
-Landroid/net/NetworkAgent;->stopPacketKeepalive(Landroid/os/Message;)V
-Landroid/net/NetworkAgent;->unwanted()V
-Landroid/net/NetworkAgent;->VALID_NETWORK:I
-Landroid/net/NetworkAgent;->VDBG:Z
-Landroid/net/NetworkAgent;->WIFI_BASE_SCORE:I
-Landroid/net/NetworkBadging;-><init>()V
-Landroid/net/NetworkBadging;->getBadgedWifiSignalResource(I)I
-Landroid/net/NetworkBadging;->getWifiSignalResource(I)I
-Landroid/net/NetworkCapabilities$NameOf;->nameOf(I)Ljava/lang/String;
-Landroid/net/NetworkCapabilities;->addUnwantedCapability(I)V
-Landroid/net/NetworkCapabilities;->appendStringRepresentationOfBitMaskToStringBuilder(Ljava/lang/StringBuilder;JLandroid/net/NetworkCapabilities$NameOf;Ljava/lang/String;)V
-Landroid/net/NetworkCapabilities;->appliesToUid(I)Z
-Landroid/net/NetworkCapabilities;->appliesToUidRange(Landroid/net/UidRange;)Z
-Landroid/net/NetworkCapabilities;->capabilityNameOf(I)Ljava/lang/String;
-Landroid/net/NetworkCapabilities;->capabilityNamesOf([I)Ljava/lang/String;
-Landroid/net/NetworkCapabilities;->checkValidCapability(I)V
-Landroid/net/NetworkCapabilities;->checkValidTransportType(I)V
-Landroid/net/NetworkCapabilities;->clearAll()V
-Landroid/net/NetworkCapabilities;->combineCapabilities(Landroid/net/NetworkCapabilities;)V
-Landroid/net/NetworkCapabilities;->combineLinkBandwidths(Landroid/net/NetworkCapabilities;)V
-Landroid/net/NetworkCapabilities;->combineNetCapabilities(Landroid/net/NetworkCapabilities;)V
-Landroid/net/NetworkCapabilities;->combineSignalStrength(Landroid/net/NetworkCapabilities;)V
-Landroid/net/NetworkCapabilities;->combineSpecifiers(Landroid/net/NetworkCapabilities;)V
-Landroid/net/NetworkCapabilities;->combineSSIDs(Landroid/net/NetworkCapabilities;)V
-Landroid/net/NetworkCapabilities;->combineTransportTypes(Landroid/net/NetworkCapabilities;)V
-Landroid/net/NetworkCapabilities;->combineUids(Landroid/net/NetworkCapabilities;)V
-Landroid/net/NetworkCapabilities;->DEFAULT_CAPABILITIES:J
-Landroid/net/NetworkCapabilities;->describeFirstNonRequestableCapability()Ljava/lang/String;
-Landroid/net/NetworkCapabilities;->describeImmutableDifferences(Landroid/net/NetworkCapabilities;)Ljava/lang/String;
-Landroid/net/NetworkCapabilities;->equalRequestableCapabilities(Landroid/net/NetworkCapabilities;)Z
-Landroid/net/NetworkCapabilities;->equalsLinkBandwidths(Landroid/net/NetworkCapabilities;)Z
-Landroid/net/NetworkCapabilities;->equalsNetCapabilities(Landroid/net/NetworkCapabilities;)Z
-Landroid/net/NetworkCapabilities;->equalsNetCapabilitiesRequestable(Landroid/net/NetworkCapabilities;)Z
-Landroid/net/NetworkCapabilities;->equalsSignalStrength(Landroid/net/NetworkCapabilities;)Z
-Landroid/net/NetworkCapabilities;->equalsSpecifier(Landroid/net/NetworkCapabilities;)Z
-Landroid/net/NetworkCapabilities;->equalsSSID(Landroid/net/NetworkCapabilities;)Z
-Landroid/net/NetworkCapabilities;->equalsTransportTypes(Landroid/net/NetworkCapabilities;)Z
-Landroid/net/NetworkCapabilities;->equalsUids(Landroid/net/NetworkCapabilities;)Z
-Landroid/net/NetworkCapabilities;->FORCE_RESTRICTED_CAPABILITIES:J
-Landroid/net/NetworkCapabilities;->getSSID()Ljava/lang/String;
-Landroid/net/NetworkCapabilities;->getUids()Ljava/util/Set;
-Landroid/net/NetworkCapabilities;->getUnwantedCapabilities()[I
-Landroid/net/NetworkCapabilities;->hasUnwantedCapability(I)Z
-Landroid/net/NetworkCapabilities;->INVALID_UID:I
-Landroid/net/NetworkCapabilities;->isValidCapability(I)Z
-Landroid/net/NetworkCapabilities;->isValidTransport(I)Z
-Landroid/net/NetworkCapabilities;->LINK_BANDWIDTH_UNSPECIFIED:I
-Landroid/net/NetworkCapabilities;->maxBandwidth(II)I
-Landroid/net/NetworkCapabilities;->MAX_NET_CAPABILITY:I
-Landroid/net/NetworkCapabilities;->MAX_TRANSPORT:I
-Landroid/net/NetworkCapabilities;->maybeMarkCapabilitiesRestricted()V
-Landroid/net/NetworkCapabilities;->mEstablishingVpnAppUid:I
-Landroid/net/NetworkCapabilities;->minBandwidth(II)I
-Landroid/net/NetworkCapabilities;->MIN_NET_CAPABILITY:I
-Landroid/net/NetworkCapabilities;->MIN_TRANSPORT:I
-Landroid/net/NetworkCapabilities;->mLinkDownBandwidthKbps:I
-Landroid/net/NetworkCapabilities;->mLinkUpBandwidthKbps:I
-Landroid/net/NetworkCapabilities;->mNetworkSpecifier:Landroid/net/NetworkSpecifier;
-Landroid/net/NetworkCapabilities;->mSSID:Ljava/lang/String;
-Landroid/net/NetworkCapabilities;->mTransportTypes:J
-Landroid/net/NetworkCapabilities;->mUids:Landroid/util/ArraySet;
-Landroid/net/NetworkCapabilities;->mUnwantedNetworkCapabilities:J
-Landroid/net/NetworkCapabilities;->MUTABLE_CAPABILITIES:J
-Landroid/net/NetworkCapabilities;->NON_REQUESTABLE_CAPABILITIES:J
-Landroid/net/NetworkCapabilities;->removeTransportType(I)Landroid/net/NetworkCapabilities;
-Landroid/net/NetworkCapabilities;->RESTRICTED_CAPABILITIES:J
-Landroid/net/NetworkCapabilities;->satisfiedByImmutableNetworkCapabilities(Landroid/net/NetworkCapabilities;)Z
-Landroid/net/NetworkCapabilities;->satisfiedByLinkBandwidths(Landroid/net/NetworkCapabilities;)Z
-Landroid/net/NetworkCapabilities;->satisfiedByNetCapabilities(Landroid/net/NetworkCapabilities;Z)Z
-Landroid/net/NetworkCapabilities;->satisfiedByNetworkCapabilities(Landroid/net/NetworkCapabilities;)Z
-Landroid/net/NetworkCapabilities;->satisfiedByNetworkCapabilities(Landroid/net/NetworkCapabilities;Z)Z
-Landroid/net/NetworkCapabilities;->satisfiedBySignalStrength(Landroid/net/NetworkCapabilities;)Z
-Landroid/net/NetworkCapabilities;->satisfiedBySpecifier(Landroid/net/NetworkCapabilities;)Z
-Landroid/net/NetworkCapabilities;->satisfiedBySSID(Landroid/net/NetworkCapabilities;)Z
-Landroid/net/NetworkCapabilities;->satisfiedByTransportTypes(Landroid/net/NetworkCapabilities;)Z
-Landroid/net/NetworkCapabilities;->satisfiedByUids(Landroid/net/NetworkCapabilities;)Z
-Landroid/net/NetworkCapabilities;->set(Landroid/net/NetworkCapabilities;)V
-Landroid/net/NetworkCapabilities;->setCapabilities([I)V
-Landroid/net/NetworkCapabilities;->setCapabilities([I[I)V
-Landroid/net/NetworkCapabilities;->setCapability(IZ)Landroid/net/NetworkCapabilities;
-Landroid/net/NetworkCapabilities;->setEstablishingVpnAppUid(I)V
-Landroid/net/NetworkCapabilities;->setLinkDownstreamBandwidthKbps(I)Landroid/net/NetworkCapabilities;
-Landroid/net/NetworkCapabilities;->setLinkUpstreamBandwidthKbps(I)Landroid/net/NetworkCapabilities;
-Landroid/net/NetworkCapabilities;->setNetworkSpecifier(Landroid/net/NetworkSpecifier;)Landroid/net/NetworkCapabilities;
-Landroid/net/NetworkCapabilities;->setSingleUid(I)Landroid/net/NetworkCapabilities;
-Landroid/net/NetworkCapabilities;->setSSID(Ljava/lang/String;)Landroid/net/NetworkCapabilities;
-Landroid/net/NetworkCapabilities;->setTransportType(IZ)Landroid/net/NetworkCapabilities;
-Landroid/net/NetworkCapabilities;->setTransportTypes([I)V
-Landroid/net/NetworkCapabilities;->setUids(Ljava/util/Set;)Landroid/net/NetworkCapabilities;
-Landroid/net/NetworkCapabilities;->SIGNAL_STRENGTH_UNSPECIFIED:I
-Landroid/net/NetworkCapabilities;->TAG:Ljava/lang/String;
-Landroid/net/NetworkCapabilities;->transportNameOf(I)Ljava/lang/String;
-Landroid/net/NetworkCapabilities;->TRANSPORT_NAMES:[Ljava/lang/String;
-Landroid/net/NetworkCapabilities;->UNRESTRICTED_CAPABILITIES:J
-Landroid/net/NetworkCapabilities;->writeToProto(Landroid/util/proto/ProtoOutputStream;J)V
-Landroid/net/NetworkCapabilitiesProto;-><init>()V
-Landroid/net/NetworkCapabilitiesProto;->CAN_REPORT_SIGNAL_STRENGTH:J
-Landroid/net/NetworkCapabilitiesProto;->CAPABILITIES:J
-Landroid/net/NetworkCapabilitiesProto;->LINK_DOWN_BANDWIDTH_KBPS:J
-Landroid/net/NetworkCapabilitiesProto;->LINK_UP_BANDWIDTH_KBPS:J
-Landroid/net/NetworkCapabilitiesProto;->NETWORK_SPECIFIER:J
-Landroid/net/NetworkCapabilitiesProto;->NET_CAPABILITY_CAPTIVE_PORTAL:I
-Landroid/net/NetworkCapabilitiesProto;->NET_CAPABILITY_CBS:I
-Landroid/net/NetworkCapabilitiesProto;->NET_CAPABILITY_DUN:I
-Landroid/net/NetworkCapabilitiesProto;->NET_CAPABILITY_EIMS:I
-Landroid/net/NetworkCapabilitiesProto;->NET_CAPABILITY_FOREGROUND:I
-Landroid/net/NetworkCapabilitiesProto;->NET_CAPABILITY_FOTA:I
-Landroid/net/NetworkCapabilitiesProto;->NET_CAPABILITY_IA:I
-Landroid/net/NetworkCapabilitiesProto;->NET_CAPABILITY_IMS:I
-Landroid/net/NetworkCapabilitiesProto;->NET_CAPABILITY_INTERNET:I
-Landroid/net/NetworkCapabilitiesProto;->NET_CAPABILITY_MMS:I
-Landroid/net/NetworkCapabilitiesProto;->NET_CAPABILITY_NOT_METERED:I
-Landroid/net/NetworkCapabilitiesProto;->NET_CAPABILITY_NOT_RESTRICTED:I
-Landroid/net/NetworkCapabilitiesProto;->NET_CAPABILITY_NOT_ROAMING:I
-Landroid/net/NetworkCapabilitiesProto;->NET_CAPABILITY_NOT_VPN:I
-Landroid/net/NetworkCapabilitiesProto;->NET_CAPABILITY_RCS:I
-Landroid/net/NetworkCapabilitiesProto;->NET_CAPABILITY_SUPL:I
-Landroid/net/NetworkCapabilitiesProto;->NET_CAPABILITY_TRUSTED:I
-Landroid/net/NetworkCapabilitiesProto;->NET_CAPABILITY_VALIDATED:I
-Landroid/net/NetworkCapabilitiesProto;->NET_CAPABILITY_WIFI_P2P:I
-Landroid/net/NetworkCapabilitiesProto;->NET_CAPABILITY_XCAP:I
-Landroid/net/NetworkCapabilitiesProto;->SIGNAL_STRENGTH:J
-Landroid/net/NetworkCapabilitiesProto;->TRANSPORTS:J
-Landroid/net/NetworkCapabilitiesProto;->TRANSPORT_BLUETOOTH:I
-Landroid/net/NetworkCapabilitiesProto;->TRANSPORT_CELLULAR:I
-Landroid/net/NetworkCapabilitiesProto;->TRANSPORT_ETHERNET:I
-Landroid/net/NetworkCapabilitiesProto;->TRANSPORT_LOWPAN:I
-Landroid/net/NetworkCapabilitiesProto;->TRANSPORT_VPN:I
-Landroid/net/NetworkCapabilitiesProto;->TRANSPORT_WIFI:I
-Landroid/net/NetworkCapabilitiesProto;->TRANSPORT_WIFI_AWARE:I
-Landroid/net/NetworkConfig;-><init>(Ljava/lang/String;)V
-Landroid/net/NetworkConfig;->dependencyMet:Z
-Landroid/net/NetworkConfig;->isDefault()Z
-Landroid/net/NetworkConfig;->name:Ljava/lang/String;
-Landroid/net/NetworkConfig;->priority:I
-Landroid/net/NetworkConfig;->radio:I
-Landroid/net/NetworkConfig;->restoreTime:I
-Landroid/net/NetworkConfig;->type:I
-Landroid/net/NetworkFactory$NetworkRequestInfo;->request:Landroid/net/NetworkRequest;
-Landroid/net/NetworkFactory$NetworkRequestInfo;->requested:Z
-Landroid/net/NetworkFactory$NetworkRequestInfo;->score:I
-Landroid/net/NetworkFactory;->acceptRequest(Landroid/net/NetworkRequest;I)Z
-Landroid/net/NetworkFactory;->addNetworkRequest(Landroid/net/NetworkRequest;I)V
-Landroid/net/NetworkFactory;->BASE:I
-Landroid/net/NetworkFactory;->CMD_CANCEL_REQUEST:I
-Landroid/net/NetworkFactory;->CMD_REQUEST_NETWORK:I
-Landroid/net/NetworkFactory;->CMD_SET_FILTER:I
-Landroid/net/NetworkFactory;->CMD_SET_SCORE:I
-Landroid/net/NetworkFactory;->DBG:Z
-Landroid/net/NetworkFactory;->evalRequest(Landroid/net/NetworkFactory$NetworkRequestInfo;)V
-Landroid/net/NetworkFactory;->evalRequests()V
-Landroid/net/NetworkFactory;->getRequestCount()I
-Landroid/net/NetworkFactory;->handleAddRequest(Landroid/net/NetworkRequest;I)V
-Landroid/net/NetworkFactory;->handleRemoveRequest(Landroid/net/NetworkRequest;)V
-Landroid/net/NetworkFactory;->handleSetFilter(Landroid/net/NetworkCapabilities;)V
-Landroid/net/NetworkFactory;->handleSetScore(I)V
-Landroid/net/NetworkFactory;->log(Ljava/lang/String;)V
-Landroid/net/NetworkFactory;->LOG_TAG:Ljava/lang/String;
-Landroid/net/NetworkFactory;->mCapabilityFilter:Landroid/net/NetworkCapabilities;
-Landroid/net/NetworkFactory;->mContext:Landroid/content/Context;
-Landroid/net/NetworkFactory;->mMessenger:Landroid/os/Messenger;
-Landroid/net/NetworkFactory;->mNetworkRequests:Landroid/util/SparseArray;
-Landroid/net/NetworkFactory;->mRefCount:I
-Landroid/net/NetworkFactory;->mScore:I
-Landroid/net/NetworkFactory;->needNetworkFor(Landroid/net/NetworkRequest;I)V
-Landroid/net/NetworkFactory;->reevaluateAllRequests()V
-Landroid/net/NetworkFactory;->register()V
-Landroid/net/NetworkFactory;->releaseNetworkFor(Landroid/net/NetworkRequest;)V
-Landroid/net/NetworkFactory;->removeNetworkRequest(Landroid/net/NetworkRequest;)V
-Landroid/net/NetworkFactory;->setCapabilityFilter(Landroid/net/NetworkCapabilities;)V
-Landroid/net/NetworkFactory;->startNetwork()V
-Landroid/net/NetworkFactory;->stopNetwork()V
-Landroid/net/NetworkFactory;->unregister()V
-Landroid/net/NetworkFactory;->VDBG:Z
-Landroid/net/NetworkIdentity;-><init>(IILjava/lang/String;Ljava/lang/String;ZZZ)V
-Landroid/net/NetworkIdentity;->buildNetworkIdentity(Landroid/content/Context;Landroid/net/NetworkState;Z)Landroid/net/NetworkIdentity;
-Landroid/net/NetworkIdentity;->COMBINE_SUBTYPE_ENABLED:Z
-Landroid/net/NetworkIdentity;->compareTo(Landroid/net/NetworkIdentity;)I
-Landroid/net/NetworkIdentity;->getDefaultNetwork()Z
-Landroid/net/NetworkIdentity;->getMetered()Z
-Landroid/net/NetworkIdentity;->getNetworkId()Ljava/lang/String;
-Landroid/net/NetworkIdentity;->getRoaming()Z
-Landroid/net/NetworkIdentity;->getSubscriberId()Ljava/lang/String;
-Landroid/net/NetworkIdentity;->getSubType()I
-Landroid/net/NetworkIdentity;->getType()I
-Landroid/net/NetworkIdentity;->mDefaultNetwork:Z
-Landroid/net/NetworkIdentity;->mMetered:Z
-Landroid/net/NetworkIdentity;->mNetworkId:Ljava/lang/String;
-Landroid/net/NetworkIdentity;->mRoaming:Z
-Landroid/net/NetworkIdentity;->mSubscriberId:Ljava/lang/String;
-Landroid/net/NetworkIdentity;->mSubType:I
-Landroid/net/NetworkIdentity;->mType:I
-Landroid/net/NetworkIdentity;->scrubSubscriberId(Ljava/lang/String;)Ljava/lang/String;
-Landroid/net/NetworkIdentity;->scrubSubscriberId([Ljava/lang/String;)[Ljava/lang/String;
-Landroid/net/NetworkIdentity;->SUBTYPE_COMBINED:I
-Landroid/net/NetworkIdentity;->TAG:Ljava/lang/String;
-Landroid/net/NetworkIdentity;->writeToProto(Landroid/util/proto/ProtoOutputStream;J)V
-Landroid/net/NetworkInfo;->mDetailedState:Landroid/net/NetworkInfo$DetailedState;
-Landroid/net/NetworkInfo;->mExtraInfo:Ljava/lang/String;
-Landroid/net/NetworkInfo;->mIsAvailable:Z
-Landroid/net/NetworkInfo;->mIsFailover:Z
-Landroid/net/NetworkInfo;->mIsRoaming:Z
-Landroid/net/NetworkInfo;->mNetworkType:I
-Landroid/net/NetworkInfo;->mReason:Ljava/lang/String;
-Landroid/net/NetworkInfo;->mState:Landroid/net/NetworkInfo$State;
-Landroid/net/NetworkInfo;->mSubtype:I
-Landroid/net/NetworkInfo;->mSubtypeName:Ljava/lang/String;
-Landroid/net/NetworkInfo;->mTypeName:Ljava/lang/String;
-Landroid/net/NetworkInfo;->setExtraInfo(Ljava/lang/String;)V
-Landroid/net/NetworkInfo;->setType(I)V
-Landroid/net/NetworkInfo;->stateMap:Ljava/util/EnumMap;
-Landroid/net/NetworkKey;-><init>(Landroid/os/Parcel;)V
-Landroid/net/NetworkKey;->createFromScanResult(Landroid/net/wifi/ScanResult;)Landroid/net/NetworkKey;
-Landroid/net/NetworkKey;->createFromWifiInfo(Landroid/net/wifi/WifiInfo;)Landroid/net/NetworkKey;
-Landroid/net/NetworkKey;->TAG:Ljava/lang/String;
-Landroid/net/NetworkMisc;-><init>()V
-Landroid/net/NetworkMisc;-><init>(Landroid/net/NetworkMisc;)V
-Landroid/net/NetworkMisc;->acceptUnvalidated:Z
-Landroid/net/NetworkMisc;->allowBypass:Z
-Landroid/net/NetworkMisc;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/net/NetworkMisc;->explicitlySelected:Z
-Landroid/net/NetworkMisc;->provisioningNotificationDisabled:Z
-Landroid/net/NetworkMisc;->subscriberId:Ljava/lang/String;
-Landroid/net/NetworkPolicy;-><init>(Landroid/net/NetworkTemplate;ILjava/lang/String;JJZ)V
-Landroid/net/NetworkPolicy;-><init>(Landroid/net/NetworkTemplate;Landroid/util/RecurrenceRule;JJJJJZZ)V
-Landroid/net/NetworkPolicy;-><init>(Landroid/net/NetworkTemplate;Landroid/util/RecurrenceRule;JJJJZZ)V
-Landroid/net/NetworkPolicy;-><init>(Landroid/os/Parcel;)V
-Landroid/net/NetworkPolicy;->buildRule(ILjava/time/ZoneId;)Landroid/util/RecurrenceRule;
-Landroid/net/NetworkPolicy;->cycleIterator()Ljava/util/Iterator;
-Landroid/net/NetworkPolicy;->cycleRule:Landroid/util/RecurrenceRule;
-Landroid/net/NetworkPolicy;->CYCLE_NONE:I
-Landroid/net/NetworkPolicy;->DEFAULT_MTU:J
-Landroid/net/NetworkPolicy;->getBytesForBackup()[B
-Landroid/net/NetworkPolicy;->getNetworkPolicyFromBackup(Ljava/io/DataInputStream;)Landroid/net/NetworkPolicy;
-Landroid/net/NetworkPolicy;->hasCycle()Z
-Landroid/net/NetworkPolicy;->lastLimitSnooze:J
-Landroid/net/NetworkPolicy;->lastRapidSnooze:J
-Landroid/net/NetworkPolicy;->lastWarningSnooze:J
-Landroid/net/NetworkPolicy;->LIMIT_DISABLED:J
-Landroid/net/NetworkPolicy;->SNOOZE_NEVER:J
-Landroid/net/NetworkPolicy;->VERSION_INIT:I
-Landroid/net/NetworkPolicy;->VERSION_RAPID:I
-Landroid/net/NetworkPolicy;->VERSION_RULE:I
-Landroid/net/NetworkPolicy;->WARNING_DISABLED:J
-Landroid/net/NetworkPolicyManager$Listener;-><init>()V
-Landroid/net/NetworkPolicyManager$Listener;->onMeteredIfacesChanged([Ljava/lang/String;)V
-Landroid/net/NetworkPolicyManager$Listener;->onRestrictBackgroundChanged(Z)V
-Landroid/net/NetworkPolicyManager$Listener;->onSubscriptionOverride(III)V
-Landroid/net/NetworkPolicyManager$Listener;->onUidPoliciesChanged(II)V
-Landroid/net/NetworkPolicyManager$Listener;->onUidRulesChanged(II)V
-Landroid/net/NetworkPolicyManager;-><init>(Landroid/content/Context;Landroid/net/INetworkPolicyManager;)V
-Landroid/net/NetworkPolicyManager;->addUidPolicy(II)V
-Landroid/net/NetworkPolicyManager;->ALLOW_PLATFORM_APP_POLICY:Z
-Landroid/net/NetworkPolicyManager;->cycleIterator(Landroid/net/NetworkPolicy;)Ljava/util/Iterator;
-Landroid/net/NetworkPolicyManager;->EXTRA_NETWORK_TEMPLATE:Ljava/lang/String;
-Landroid/net/NetworkPolicyManager;->factoryReset(Ljava/lang/String;)V
-Landroid/net/NetworkPolicyManager;->FIREWALL_CHAIN_DOZABLE:I
-Landroid/net/NetworkPolicyManager;->FIREWALL_CHAIN_NAME_DOZABLE:Ljava/lang/String;
-Landroid/net/NetworkPolicyManager;->FIREWALL_CHAIN_NAME_NONE:Ljava/lang/String;
-Landroid/net/NetworkPolicyManager;->FIREWALL_CHAIN_NAME_POWERSAVE:Ljava/lang/String;
-Landroid/net/NetworkPolicyManager;->FIREWALL_CHAIN_NAME_STANDBY:Ljava/lang/String;
-Landroid/net/NetworkPolicyManager;->FIREWALL_CHAIN_NONE:I
-Landroid/net/NetworkPolicyManager;->FIREWALL_CHAIN_POWERSAVE:I
-Landroid/net/NetworkPolicyManager;->FIREWALL_CHAIN_STANDBY:I
-Landroid/net/NetworkPolicyManager;->FIREWALL_RULE_ALLOW:I
-Landroid/net/NetworkPolicyManager;->FIREWALL_RULE_DEFAULT:I
-Landroid/net/NetworkPolicyManager;->FIREWALL_RULE_DENY:I
-Landroid/net/NetworkPolicyManager;->FIREWALL_TYPE_BLACKLIST:I
-Landroid/net/NetworkPolicyManager;->FIREWALL_TYPE_WHITELIST:I
-Landroid/net/NetworkPolicyManager;->FOREGROUND_THRESHOLD_STATE:I
-Landroid/net/NetworkPolicyManager;->isProcStateAllowedWhileIdleOrPowerSaveMode(I)Z
-Landroid/net/NetworkPolicyManager;->isProcStateAllowedWhileOnRestrictBackground(I)Z
-Landroid/net/NetworkPolicyManager;->isUidValidForPolicy(Landroid/content/Context;I)Z
-Landroid/net/NetworkPolicyManager;->MASK_ALL_NETWORKS:I
-Landroid/net/NetworkPolicyManager;->MASK_METERED_NETWORKS:I
-Landroid/net/NetworkPolicyManager;->mContext:Landroid/content/Context;
-Landroid/net/NetworkPolicyManager;->OVERRIDE_CONGESTED:I
-Landroid/net/NetworkPolicyManager;->OVERRIDE_UNMETERED:I
-Landroid/net/NetworkPolicyManager;->POLICY_ALLOW_METERED_BACKGROUND:I
-Landroid/net/NetworkPolicyManager;->POLICY_NONE:I
-Landroid/net/NetworkPolicyManager;->POLICY_REJECT_METERED_BACKGROUND:I
-Landroid/net/NetworkPolicyManager;->removeUidPolicy(II)V
-Landroid/net/NetworkPolicyManager;->resolveNetworkId(Landroid/net/wifi/WifiConfiguration;)Ljava/lang/String;
-Landroid/net/NetworkPolicyManager;->resolveNetworkId(Ljava/lang/String;)Ljava/lang/String;
-Landroid/net/NetworkPolicyManager;->RULE_ALLOW_ALL:I
-Landroid/net/NetworkPolicyManager;->RULE_ALLOW_METERED:I
-Landroid/net/NetworkPolicyManager;->RULE_NONE:I
-Landroid/net/NetworkPolicyManager;->RULE_REJECT_ALL:I
-Landroid/net/NetworkPolicyManager;->RULE_REJECT_METERED:I
-Landroid/net/NetworkPolicyManager;->RULE_TEMPORARY_ALLOW_METERED:I
-Landroid/net/NetworkPolicyManager;->setNetworkPolicies([Landroid/net/NetworkPolicy;)V
-Landroid/net/NetworkPolicyManager;->uidPoliciesToString(I)Ljava/lang/String;
-Landroid/net/NetworkPolicyManager;->uidRulesToString(I)Ljava/lang/String;
-Landroid/net/NetworkProto;-><init>()V
-Landroid/net/NetworkProto;->NET_ID:J
-Landroid/net/NetworkQuotaInfo;-><init>()V
-Landroid/net/NetworkQuotaInfo;-><init>(Landroid/os/Parcel;)V
-Landroid/net/NetworkQuotaInfo;->NO_LIMIT:J
-Landroid/net/NetworkRecommendationProvider$ServiceWrapper;->enforceCallingPermission()V
-Landroid/net/NetworkRecommendationProvider$ServiceWrapper;->execute(Ljava/lang/Runnable;)V
-Landroid/net/NetworkRecommendationProvider$ServiceWrapper;->mContext:Landroid/content/Context;
-Landroid/net/NetworkRecommendationProvider$ServiceWrapper;->mExecutor:Ljava/util/concurrent/Executor;
-Landroid/net/NetworkRecommendationProvider$ServiceWrapper;->mHandler:Landroid/os/Handler;
-Landroid/net/NetworkRecommendationProvider$ServiceWrapper;->requestScores([Landroid/net/NetworkKey;)V
-Landroid/net/NetworkRecommendationProvider;->mService:Landroid/os/IBinder;
-Landroid/net/NetworkRecommendationProvider;->TAG:Ljava/lang/String;
-Landroid/net/NetworkRecommendationProvider;->VERBOSE:Z
-Landroid/net/NetworkRequest$Builder;->addUnwantedCapability(I)Landroid/net/NetworkRequest$Builder;
-Landroid/net/NetworkRequest$Builder;->mNetworkCapabilities:Landroid/net/NetworkCapabilities;
-Landroid/net/NetworkRequest$Builder;->setCapabilities(Landroid/net/NetworkCapabilities;)Landroid/net/NetworkRequest$Builder;
-Landroid/net/NetworkRequest$Builder;->setLinkDownstreamBandwidthKbps(I)Landroid/net/NetworkRequest$Builder;
-Landroid/net/NetworkRequest$Builder;->setLinkUpstreamBandwidthKbps(I)Landroid/net/NetworkRequest$Builder;
-Landroid/net/NetworkRequest$Builder;->setUids(Ljava/util/Set;)Landroid/net/NetworkRequest$Builder;
-Landroid/net/NetworkRequest$Type;->BACKGROUND_REQUEST:Landroid/net/NetworkRequest$Type;
-Landroid/net/NetworkRequest$Type;->LISTEN:Landroid/net/NetworkRequest$Type;
-Landroid/net/NetworkRequest$Type;->NONE:Landroid/net/NetworkRequest$Type;
-Landroid/net/NetworkRequest$Type;->REQUEST:Landroid/net/NetworkRequest$Type;
-Landroid/net/NetworkRequest$Type;->TRACK_DEFAULT:Landroid/net/NetworkRequest$Type;
-Landroid/net/NetworkRequest$Type;->valueOf(Ljava/lang/String;)Landroid/net/NetworkRequest$Type;
-Landroid/net/NetworkRequest$Type;->values()[Landroid/net/NetworkRequest$Type;
-Landroid/net/NetworkRequest;-><init>(Landroid/net/NetworkCapabilities;IILandroid/net/NetworkRequest$Type;)V
-Landroid/net/NetworkRequest;-><init>(Landroid/net/NetworkRequest;)V
-Landroid/net/NetworkRequest;->hasUnwantedCapability(I)Z
-Landroid/net/NetworkRequest;->isBackgroundRequest()Z
-Landroid/net/NetworkRequest;->isForegroundRequest()Z
-Landroid/net/NetworkRequest;->isListen()Z
-Landroid/net/NetworkRequest;->isRequest()Z
-Landroid/net/NetworkRequest;->type:Landroid/net/NetworkRequest$Type;
-Landroid/net/NetworkRequest;->typeToProtoEnum(Landroid/net/NetworkRequest$Type;)I
-Landroid/net/NetworkRequest;->writeToProto(Landroid/util/proto/ProtoOutputStream;J)V
-Landroid/net/NetworkRequestProto;-><init>()V
-Landroid/net/NetworkRequestProto;->LEGACY_TYPE:J
-Landroid/net/NetworkRequestProto;->NETWORK_CAPABILITIES:J
-Landroid/net/NetworkRequestProto;->REQUEST_ID:J
-Landroid/net/NetworkRequestProto;->TYPE:J
-Landroid/net/NetworkRequestProto;->TYPE_BACKGROUND_REQUEST:I
-Landroid/net/NetworkRequestProto;->TYPE_LISTEN:I
-Landroid/net/NetworkRequestProto;->TYPE_NONE:I
-Landroid/net/NetworkRequestProto;->TYPE_REQUEST:I
-Landroid/net/NetworkRequestProto;->TYPE_TRACK_DEFAULT:I
-Landroid/net/NetworkRequestProto;->TYPE_UNKNOWN:I
-Landroid/net/NetworkScoreManager;-><init>(Landroid/content/Context;)V
-Landroid/net/NetworkScoreManager;->CACHE_FILTER_CURRENT_NETWORK:I
-Landroid/net/NetworkScoreManager;->CACHE_FILTER_NONE:I
-Landroid/net/NetworkScoreManager;->CACHE_FILTER_SCAN_RESULTS:I
-Landroid/net/NetworkScoreManager;->getActiveScorer()Landroid/net/NetworkScorerAppData;
-Landroid/net/NetworkScoreManager;->getAllValidScorers()Ljava/util/List;
-Landroid/net/NetworkScoreManager;->isCallerActiveScorer(I)Z
-Landroid/net/NetworkScoreManager;->mContext:Landroid/content/Context;
-Landroid/net/NetworkScoreManager;->mService:Landroid/net/INetworkScoreService;
-Landroid/net/NetworkScoreManager;->NETWORK_AVAILABLE_NOTIFICATION_CHANNEL_ID_META_DATA:Ljava/lang/String;
-Landroid/net/NetworkScoreManager;->RECOMMENDATIONS_ENABLED_FORCED_OFF:I
-Landroid/net/NetworkScoreManager;->RECOMMENDATIONS_ENABLED_OFF:I
-Landroid/net/NetworkScoreManager;->RECOMMENDATIONS_ENABLED_ON:I
-Landroid/net/NetworkScoreManager;->RECOMMENDATION_SERVICE_LABEL_META_DATA:Ljava/lang/String;
-Landroid/net/NetworkScoreManager;->registerNetworkScoreCache(ILandroid/net/INetworkScoreCache;)V
-Landroid/net/NetworkScoreManager;->registerNetworkScoreCache(ILandroid/net/INetworkScoreCache;I)V
-Landroid/net/NetworkScoreManager;->requestScores([Landroid/net/NetworkKey;)Z
-Landroid/net/NetworkScoreManager;->unregisterNetworkScoreCache(ILandroid/net/INetworkScoreCache;)V
-Landroid/net/NetworkScoreManager;->USE_OPEN_WIFI_PACKAGE_META_DATA:Ljava/lang/String;
-Landroid/net/NetworkScorerAppData;-><init>(ILandroid/content/ComponentName;Ljava/lang/String;Landroid/content/ComponentName;Ljava/lang/String;)V
-Landroid/net/NetworkScorerAppData;-><init>(Landroid/os/Parcel;)V
-Landroid/net/NetworkScorerAppData;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/net/NetworkScorerAppData;->getEnableUseOpenWifiActivity()Landroid/content/ComponentName;
-Landroid/net/NetworkScorerAppData;->getNetworkAvailableNotificationChannelId()Ljava/lang/String;
-Landroid/net/NetworkScorerAppData;->getRecommendationServiceComponent()Landroid/content/ComponentName;
-Landroid/net/NetworkScorerAppData;->getRecommendationServiceLabel()Ljava/lang/String;
-Landroid/net/NetworkScorerAppData;->getRecommendationServicePackageName()Ljava/lang/String;
-Landroid/net/NetworkScorerAppData;->mEnableUseOpenWifiActivity:Landroid/content/ComponentName;
-Landroid/net/NetworkScorerAppData;->mNetworkAvailableNotificationChannelId:Ljava/lang/String;
-Landroid/net/NetworkScorerAppData;->mRecommendationService:Landroid/content/ComponentName;
-Landroid/net/NetworkScorerAppData;->mRecommendationServiceLabel:Ljava/lang/String;
-Landroid/net/NetworkScorerAppData;->packageUid:I
-Landroid/net/NetworkSpecifier;-><init>()V
-Landroid/net/NetworkSpecifier;->assertValidFromUid(I)V
-Landroid/net/NetworkSpecifier;->satisfiedBy(Landroid/net/NetworkSpecifier;)Z
-Landroid/net/NetworkState;-><init>(Landroid/net/NetworkInfo;Landroid/net/LinkProperties;Landroid/net/NetworkCapabilities;Landroid/net/Network;Ljava/lang/String;Ljava/lang/String;)V
-Landroid/net/NetworkState;->EMPTY:Landroid/net/NetworkState;
-Landroid/net/NetworkState;->linkProperties:Landroid/net/LinkProperties;
-Landroid/net/NetworkState;->networkCapabilities:Landroid/net/NetworkCapabilities;
-Landroid/net/NetworkState;->networkId:Ljava/lang/String;
-Landroid/net/NetworkState;->networkInfo:Landroid/net/NetworkInfo;
-Landroid/net/NetworkState;->SANITY_CHECK_ROAMING:Z
-Landroid/net/NetworkState;->subscriberId:Ljava/lang/String;
-Landroid/net/NetworkStats$Entry;-><init>(JJJJJ)V
-Landroid/net/NetworkStats$Entry;-><init>(Ljava/lang/String;IIIIIIJJJJJ)V
-Landroid/net/NetworkStats$Entry;-><init>(Ljava/lang/String;IIIJJJJJ)V
-Landroid/net/NetworkStats$Entry;->add(Landroid/net/NetworkStats$Entry;)V
-Landroid/net/NetworkStats$Entry;->defaultNetwork:I
-Landroid/net/NetworkStats$Entry;->isEmpty()Z
-Landroid/net/NetworkStats$Entry;->isNegative()Z
-Landroid/net/NetworkStats$Entry;->metered:I
-Landroid/net/NetworkStats$Entry;->operations:J
-Landroid/net/NetworkStats$Entry;->roaming:I
-Landroid/net/NetworkStats$NonMonotonicObserver;->foundNonMonotonic(Landroid/net/NetworkStats;ILandroid/net/NetworkStats;ILjava/lang/Object;)V
-Landroid/net/NetworkStats$NonMonotonicObserver;->foundNonMonotonic(Landroid/net/NetworkStats;ILjava/lang/Object;)V
-Landroid/net/NetworkStats;->addIfaceValues(Ljava/lang/String;JJJJ)Landroid/net/NetworkStats;
-Landroid/net/NetworkStats;->addTrafficToApplications(ILjava/lang/String;Ljava/lang/String;Landroid/net/NetworkStats$Entry;Landroid/net/NetworkStats$Entry;)Landroid/net/NetworkStats$Entry;
-Landroid/net/NetworkStats;->addValues(Landroid/net/NetworkStats$Entry;)Landroid/net/NetworkStats;
-Landroid/net/NetworkStats;->addValues(Ljava/lang/String;IIIIIIJJJJJ)Landroid/net/NetworkStats;
-Landroid/net/NetworkStats;->addValues(Ljava/lang/String;IIIJJJJJ)Landroid/net/NetworkStats;
-Landroid/net/NetworkStats;->apply464xlatAdjustments(Landroid/net/NetworkStats;Landroid/net/NetworkStats;Ljava/util/Map;)V
-Landroid/net/NetworkStats;->apply464xlatAdjustments(Ljava/util/Map;)V
-Landroid/net/NetworkStats;->CLATD_INTERFACE_PREFIX:Ljava/lang/String;
-Landroid/net/NetworkStats;->clear()V
-Landroid/net/NetworkStats;->combineValues(Ljava/lang/String;IIIJJJJJ)Landroid/net/NetworkStats;
-Landroid/net/NetworkStats;->combineValues(Ljava/lang/String;IIJJJJJ)Landroid/net/NetworkStats;
-Landroid/net/NetworkStats;->deductTrafficFromVpnApp(ILjava/lang/String;Landroid/net/NetworkStats$Entry;)V
-Landroid/net/NetworkStats;->defaultNetworkToString(I)Ljava/lang/String;
-Landroid/net/NetworkStats;->DEFAULT_NETWORK_ALL:I
-Landroid/net/NetworkStats;->DEFAULT_NETWORK_NO:I
-Landroid/net/NetworkStats;->DEFAULT_NETWORK_YES:I
-Landroid/net/NetworkStats;->dump(Ljava/lang/String;Ljava/io/PrintWriter;)V
-Landroid/net/NetworkStats;->elapsedRealtime:J
-Landroid/net/NetworkStats;->filter(I[Ljava/lang/String;I)V
-Landroid/net/NetworkStats;->findIndex(Ljava/lang/String;IIIIII)I
-Landroid/net/NetworkStats;->findIndexHinted(Ljava/lang/String;IIIIIII)I
-Landroid/net/NetworkStats;->getElapsedRealtime()J
-Landroid/net/NetworkStats;->getElapsedRealtimeAge()J
-Landroid/net/NetworkStats;->getTotal(Landroid/net/NetworkStats$Entry;Ljava/util/HashSet;)Landroid/net/NetworkStats$Entry;
-Landroid/net/NetworkStats;->getTotal(Landroid/net/NetworkStats$Entry;Ljava/util/HashSet;IZ)Landroid/net/NetworkStats$Entry;
-Landroid/net/NetworkStats;->getTotalPackets()J
-Landroid/net/NetworkStats;->getUniqueIfaces()[Ljava/lang/String;
-Landroid/net/NetworkStats;->groupedByIface()Landroid/net/NetworkStats;
-Landroid/net/NetworkStats;->groupedByUid()Landroid/net/NetworkStats;
-Landroid/net/NetworkStats;->IFACE_ALL:Ljava/lang/String;
-Landroid/net/NetworkStats;->INTERFACES_ALL:[Ljava/lang/String;
-Landroid/net/NetworkStats;->internalSize()I
-Landroid/net/NetworkStats;->IPV4V6_HEADER_DELTA:I
-Landroid/net/NetworkStats;->meteredToString(I)Ljava/lang/String;
-Landroid/net/NetworkStats;->METERED_ALL:I
-Landroid/net/NetworkStats;->METERED_NO:I
-Landroid/net/NetworkStats;->METERED_YES:I
-Landroid/net/NetworkStats;->migrateTun(ILjava/lang/String;Ljava/lang/String;)Z
-Landroid/net/NetworkStats;->roamingToString(I)Ljava/lang/String;
-Landroid/net/NetworkStats;->ROAMING_ALL:I
-Landroid/net/NetworkStats;->ROAMING_NO:I
-Landroid/net/NetworkStats;->ROAMING_YES:I
-Landroid/net/NetworkStats;->setElapsedRealtime(J)V
-Landroid/net/NetworkStats;->setMatches(II)Z
-Landroid/net/NetworkStats;->setToCheckinString(I)Ljava/lang/String;
-Landroid/net/NetworkStats;->setToString(I)Ljava/lang/String;
-Landroid/net/NetworkStats;->setValues(ILandroid/net/NetworkStats$Entry;)V
-Landroid/net/NetworkStats;->SET_ALL:I
-Landroid/net/NetworkStats;->SET_DBG_VPN_IN:I
-Landroid/net/NetworkStats;->SET_DBG_VPN_OUT:I
-Landroid/net/NetworkStats;->SET_DEBUG_START:I
-Landroid/net/NetworkStats;->SET_DEFAULT:I
-Landroid/net/NetworkStats;->SET_FOREGROUND:I
-Landroid/net/NetworkStats;->spliceOperationsFrom(Landroid/net/NetworkStats;)V
-Landroid/net/NetworkStats;->STATS_PER_IFACE:I
-Landroid/net/NetworkStats;->STATS_PER_UID:I
-Landroid/net/NetworkStats;->subtract(Landroid/net/NetworkStats;)Landroid/net/NetworkStats;
-Landroid/net/NetworkStats;->subtract(Landroid/net/NetworkStats;Landroid/net/NetworkStats;Landroid/net/NetworkStats$NonMonotonicObserver;Ljava/lang/Object;)Landroid/net/NetworkStats;
-Landroid/net/NetworkStats;->subtract(Landroid/net/NetworkStats;Landroid/net/NetworkStats;Landroid/net/NetworkStats$NonMonotonicObserver;Ljava/lang/Object;Landroid/net/NetworkStats;)Landroid/net/NetworkStats;
-Landroid/net/NetworkStats;->TAG:Ljava/lang/String;
-Landroid/net/NetworkStats;->tagToString(I)Ljava/lang/String;
-Landroid/net/NetworkStats;->TAG_ALL:I
-Landroid/net/NetworkStats;->TAG_NONE:I
-Landroid/net/NetworkStats;->tunAdjustmentInit(ILjava/lang/String;Ljava/lang/String;Landroid/net/NetworkStats$Entry;Landroid/net/NetworkStats$Entry;)V
-Landroid/net/NetworkStats;->tunGetPool(Landroid/net/NetworkStats$Entry;Landroid/net/NetworkStats$Entry;)Landroid/net/NetworkStats$Entry;
-Landroid/net/NetworkStats;->tunSubtract(ILandroid/net/NetworkStats;Landroid/net/NetworkStats$Entry;)V
-Landroid/net/NetworkStats;->UID_ALL:I
-Landroid/net/NetworkStats;->withoutUids([I)Landroid/net/NetworkStats;
-Landroid/net/NetworkStatsHistory$DataStreamUtils;-><init>()V
-Landroid/net/NetworkStatsHistory$DataStreamUtils;->readFullLongArray(Ljava/io/DataInputStream;)[J
-Landroid/net/NetworkStatsHistory$DataStreamUtils;->readVarLong(Ljava/io/DataInputStream;)J
-Landroid/net/NetworkStatsHistory$DataStreamUtils;->readVarLongArray(Ljava/io/DataInputStream;)[J
-Landroid/net/NetworkStatsHistory$DataStreamUtils;->writeVarLong(Ljava/io/DataOutputStream;J)V
-Landroid/net/NetworkStatsHistory$DataStreamUtils;->writeVarLongArray(Ljava/io/DataOutputStream;[JI)V
-Landroid/net/NetworkStatsHistory$Entry;-><init>()V
-Landroid/net/NetworkStatsHistory$Entry;->activeTime:J
-Landroid/net/NetworkStatsHistory$Entry;->operations:J
-Landroid/net/NetworkStatsHistory$Entry;->UNKNOWN:J
-Landroid/net/NetworkStatsHistory$ParcelUtils;-><init>()V
-Landroid/net/NetworkStatsHistory$ParcelUtils;->readLongArray(Landroid/os/Parcel;)[J
-Landroid/net/NetworkStatsHistory$ParcelUtils;->writeLongArray(Landroid/os/Parcel;[JI)V
-Landroid/net/NetworkStatsHistory;-><init>(JI)V
-Landroid/net/NetworkStatsHistory;-><init>(JII)V
-Landroid/net/NetworkStatsHistory;-><init>(Landroid/net/NetworkStatsHistory;J)V
-Landroid/net/NetworkStatsHistory;-><init>(Ljava/io/DataInputStream;)V
-Landroid/net/NetworkStatsHistory;->activeTime:[J
-Landroid/net/NetworkStatsHistory;->addLong([JIJ)V
-Landroid/net/NetworkStatsHistory;->bucketCount:I
-Landroid/net/NetworkStatsHistory;->bucketDuration:J
-Landroid/net/NetworkStatsHistory;->bucketStart:[J
-Landroid/net/NetworkStatsHistory;->clear()V
-Landroid/net/NetworkStatsHistory;->dump(Lcom/android/internal/util/IndentingPrintWriter;Z)V
-Landroid/net/NetworkStatsHistory;->dumpCheckin(Ljava/io/PrintWriter;)V
-Landroid/net/NetworkStatsHistory;->ensureBuckets(JJ)V
-Landroid/net/NetworkStatsHistory;->estimateResizeBuckets(J)I
-Landroid/net/NetworkStatsHistory;->FIELD_ACTIVE_TIME:I
-Landroid/net/NetworkStatsHistory;->FIELD_ALL:I
-Landroid/net/NetworkStatsHistory;->FIELD_OPERATIONS:I
-Landroid/net/NetworkStatsHistory;->FIELD_RX_BYTES:I
-Landroid/net/NetworkStatsHistory;->FIELD_RX_PACKETS:I
-Landroid/net/NetworkStatsHistory;->FIELD_TX_BYTES:I
-Landroid/net/NetworkStatsHistory;->FIELD_TX_PACKETS:I
-Landroid/net/NetworkStatsHistory;->generateRandom(JJJ)V
-Landroid/net/NetworkStatsHistory;->generateRandom(JJJJJJJLjava/util/Random;)V
-Landroid/net/NetworkStatsHistory;->getBucketDuration()J
-Landroid/net/NetworkStatsHistory;->getIndexAfter(J)I
-Landroid/net/NetworkStatsHistory;->getLong([JIJ)J
-Landroid/net/NetworkStatsHistory;->getTotalBytes()J
-Landroid/net/NetworkStatsHistory;->insertBucket(IJ)V
-Landroid/net/NetworkStatsHistory;->intersects(JJ)Z
-Landroid/net/NetworkStatsHistory;->operations:[J
-Landroid/net/NetworkStatsHistory;->randomLong(Ljava/util/Random;JJ)J
-Landroid/net/NetworkStatsHistory;->recordData(JJJJ)V
-Landroid/net/NetworkStatsHistory;->recordData(JJLandroid/net/NetworkStats$Entry;)V
-Landroid/net/NetworkStatsHistory;->recordHistory(Landroid/net/NetworkStatsHistory;JJ)V
-Landroid/net/NetworkStatsHistory;->removeBucketsBefore(J)V
-Landroid/net/NetworkStatsHistory;->rxBytes:[J
-Landroid/net/NetworkStatsHistory;->rxPackets:[J
-Landroid/net/NetworkStatsHistory;->setLong([JIJ)V
-Landroid/net/NetworkStatsHistory;->setValues(ILandroid/net/NetworkStatsHistory$Entry;)V
-Landroid/net/NetworkStatsHistory;->totalBytes:J
-Landroid/net/NetworkStatsHistory;->txBytes:[J
-Landroid/net/NetworkStatsHistory;->txPackets:[J
-Landroid/net/NetworkStatsHistory;->VERSION_ADD_ACTIVE:I
-Landroid/net/NetworkStatsHistory;->VERSION_ADD_PACKETS:I
-Landroid/net/NetworkStatsHistory;->VERSION_INIT:I
-Landroid/net/NetworkStatsHistory;->writeToProto(Landroid/util/proto/ProtoOutputStream;J)V
-Landroid/net/NetworkStatsHistory;->writeToProto(Landroid/util/proto/ProtoOutputStream;J[JI)V
-Landroid/net/NetworkStatsHistory;->writeToStream(Ljava/io/DataOutputStream;)V
-Landroid/net/NetworkTemplate;-><init>(ILjava/lang/String;[Ljava/lang/String;Ljava/lang/String;)V
-Landroid/net/NetworkTemplate;-><init>(ILjava/lang/String;[Ljava/lang/String;Ljava/lang/String;III)V
-Landroid/net/NetworkTemplate;-><init>(Landroid/os/Parcel;)V
-Landroid/net/NetworkTemplate;->BACKUP_VERSION:I
-Landroid/net/NetworkTemplate;->buildTemplateBluetooth()Landroid/net/NetworkTemplate;
-Landroid/net/NetworkTemplate;->buildTemplateProxy()Landroid/net/NetworkTemplate;
-Landroid/net/NetworkTemplate;->buildTemplateWifi(Ljava/lang/String;)Landroid/net/NetworkTemplate;
-Landroid/net/NetworkTemplate;->forceAllNetworkTypes()V
-Landroid/net/NetworkTemplate;->getBytesForBackup()[B
-Landroid/net/NetworkTemplate;->getMatchRuleName(I)Ljava/lang/String;
-Landroid/net/NetworkTemplate;->getNetworkId()Ljava/lang/String;
-Landroid/net/NetworkTemplate;->getNetworkTemplateFromBackup(Ljava/io/DataInputStream;)Landroid/net/NetworkTemplate;
-Landroid/net/NetworkTemplate;->isKnownMatchRule(I)Z
-Landroid/net/NetworkTemplate;->isMatchRuleMobile()Z
-Landroid/net/NetworkTemplate;->isPersistable()Z
-Landroid/net/NetworkTemplate;->matches(Landroid/net/NetworkIdentity;)Z
-Landroid/net/NetworkTemplate;->matchesBluetooth(Landroid/net/NetworkIdentity;)Z
-Landroid/net/NetworkTemplate;->matchesDefaultNetwork(Landroid/net/NetworkIdentity;)Z
-Landroid/net/NetworkTemplate;->matchesEthernet(Landroid/net/NetworkIdentity;)Z
-Landroid/net/NetworkTemplate;->matchesMetered(Landroid/net/NetworkIdentity;)Z
-Landroid/net/NetworkTemplate;->matchesMobile(Landroid/net/NetworkIdentity;)Z
-Landroid/net/NetworkTemplate;->matchesMobileWildcard(Landroid/net/NetworkIdentity;)Z
-Landroid/net/NetworkTemplate;->matchesProxy(Landroid/net/NetworkIdentity;)Z
-Landroid/net/NetworkTemplate;->matchesRoaming(Landroid/net/NetworkIdentity;)Z
-Landroid/net/NetworkTemplate;->matchesSubscriberId(Ljava/lang/String;)Z
-Landroid/net/NetworkTemplate;->matchesWifi(Landroid/net/NetworkIdentity;)Z
-Landroid/net/NetworkTemplate;->matchesWifiWildcard(Landroid/net/NetworkIdentity;)Z
-Landroid/net/NetworkTemplate;->MATCH_BLUETOOTH:I
-Landroid/net/NetworkTemplate;->MATCH_ETHERNET:I
-Landroid/net/NetworkTemplate;->MATCH_MOBILE:I
-Landroid/net/NetworkTemplate;->MATCH_MOBILE_WILDCARD:I
-Landroid/net/NetworkTemplate;->MATCH_PROXY:I
-Landroid/net/NetworkTemplate;->MATCH_WIFI:I
-Landroid/net/NetworkTemplate;->MATCH_WIFI_WILDCARD:I
-Landroid/net/NetworkTemplate;->mDefaultNetwork:I
-Landroid/net/NetworkTemplate;->mMatchRule:I
-Landroid/net/NetworkTemplate;->mMatchSubscriberIds:[Ljava/lang/String;
-Landroid/net/NetworkTemplate;->mMetered:I
-Landroid/net/NetworkTemplate;->mNetworkId:Ljava/lang/String;
-Landroid/net/NetworkTemplate;->mRoaming:I
-Landroid/net/NetworkTemplate;->mSubscriberId:Ljava/lang/String;
-Landroid/net/NetworkTemplate;->sForceAllNetworkTypes:Z
-Landroid/net/NetworkTemplate;->TAG:Ljava/lang/String;
-Landroid/net/NetworkUtils;-><init>()V
-Landroid/net/NetworkUtils;->addressTypeMatches(Ljava/net/InetAddress;Ljava/net/InetAddress;)Z
-Landroid/net/NetworkUtils;->bindProcessToNetwork(I)Z
-Landroid/net/NetworkUtils;->bindProcessToNetworkForHostResolution(I)Z
-Landroid/net/NetworkUtils;->bindSocketToNetwork(II)I
-Landroid/net/NetworkUtils;->deduplicatePrefixSet(Ljava/util/TreeSet;)Ljava/util/TreeSet;
-Landroid/net/NetworkUtils;->getBoundNetworkForProcess()I
-Landroid/net/NetworkUtils;->getNetworkPart(Ljava/net/InetAddress;I)Ljava/net/InetAddress;
-Landroid/net/NetworkUtils;->hexToInet6Address(Ljava/lang/String;)Ljava/net/InetAddress;
-Landroid/net/NetworkUtils;->inetAddressToInt(Ljava/net/Inet4Address;)I
-Landroid/net/NetworkUtils;->makeStrings(Ljava/util/Collection;)[Ljava/lang/String;
-Landroid/net/NetworkUtils;->maskRawAddress([BI)V
-Landroid/net/NetworkUtils;->netmaskIntToPrefixLength(I)I
-Landroid/net/NetworkUtils;->parcelInetAddress(Landroid/os/Parcel;Ljava/net/InetAddress;I)V
-Landroid/net/NetworkUtils;->parseIpAndMask(Ljava/lang/String;)Landroid/util/Pair;
-Landroid/net/NetworkUtils;->protectFromVpn(I)Z
-Landroid/net/NetworkUtils;->queryUserAccess(II)Z
-Landroid/net/NetworkUtils;->routedIPv4AddressCount(Ljava/util/TreeSet;)J
-Landroid/net/NetworkUtils;->routedIPv6AddressCount(Ljava/util/TreeSet;)Ljava/math/BigInteger;
-Landroid/net/NetworkUtils;->setupRaSocket(Ljava/io/FileDescriptor;I)V
-Landroid/net/NetworkUtils;->TAG:Ljava/lang/String;
-Landroid/net/NetworkUtils;->unparcelInetAddress(Landroid/os/Parcel;)Ljava/net/InetAddress;
-Landroid/net/NetworkWatchlistManager;-><init>(Landroid/content/Context;)V
-Landroid/net/NetworkWatchlistManager;-><init>(Landroid/content/Context;Lcom/android/internal/net/INetworkWatchlistManager;)V
-Landroid/net/NetworkWatchlistManager;->getWatchlistConfigHash()[B
-Landroid/net/NetworkWatchlistManager;->mContext:Landroid/content/Context;
-Landroid/net/NetworkWatchlistManager;->mNetworkWatchlistManager:Lcom/android/internal/net/INetworkWatchlistManager;
-Landroid/net/NetworkWatchlistManager;->reloadWatchlist()V
-Landroid/net/NetworkWatchlistManager;->reportWatchlistIfNecessary()V
-Landroid/net/NetworkWatchlistManager;->SHARED_MEMORY_TAG:Ljava/lang/String;
-Landroid/net/NetworkWatchlistManager;->TAG:Ljava/lang/String;
Landroid/net/nsd/DnsSdTxtRecord;-><init>()V
Landroid/net/nsd/DnsSdTxtRecord;-><init>(Landroid/net/nsd/DnsSdTxtRecord;)V
Landroid/net/nsd/DnsSdTxtRecord;-><init>([B)V
@@ -37733,43 +36556,6 @@
Landroid/net/Proxy;->setHttpProxySystemProperty(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/net/Uri;)V
Landroid/net/Proxy;->TAG:Ljava/lang/String;
Landroid/net/Proxy;->validate(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)I
-Landroid/net/ProxyInfo;-><init>(Landroid/net/ProxyInfo;)V
-Landroid/net/ProxyInfo;-><init>(Landroid/net/Uri;)V
-Landroid/net/ProxyInfo;-><init>(Landroid/net/Uri;I)V
-Landroid/net/ProxyInfo;-><init>(Ljava/lang/String;)V
-Landroid/net/ProxyInfo;-><init>(Ljava/lang/String;ILjava/lang/String;[Ljava/lang/String;)V
-Landroid/net/ProxyInfo;->getExclusionListAsString()Ljava/lang/String;
-Landroid/net/ProxyInfo;->getSocketAddress()Ljava/net/InetSocketAddress;
-Landroid/net/ProxyInfo;->isValid()Z
-Landroid/net/ProxyInfo;->LOCAL_EXCL_LIST:Ljava/lang/String;
-Landroid/net/ProxyInfo;->LOCAL_HOST:Ljava/lang/String;
-Landroid/net/ProxyInfo;->LOCAL_PORT:I
-Landroid/net/ProxyInfo;->makeProxy()Ljava/net/Proxy;
-Landroid/net/ProxyInfo;->mExclusionList:Ljava/lang/String;
-Landroid/net/ProxyInfo;->mHost:Ljava/lang/String;
-Landroid/net/ProxyInfo;->mPacFileUrl:Landroid/net/Uri;
-Landroid/net/ProxyInfo;->mParsedExclusionList:[Ljava/lang/String;
-Landroid/net/ProxyInfo;->mPort:I
-Landroid/net/ProxyInfo;->setExclusionList(Ljava/lang/String;)V
-Landroid/net/RouteInfo;-><init>(Landroid/net/IpPrefix;)V
-Landroid/net/RouteInfo;-><init>(Landroid/net/IpPrefix;I)V
-Landroid/net/RouteInfo;-><init>(Landroid/net/IpPrefix;Ljava/net/InetAddress;)V
-Landroid/net/RouteInfo;-><init>(Landroid/net/IpPrefix;Ljava/net/InetAddress;Ljava/lang/String;I)V
-Landroid/net/RouteInfo;-><init>(Landroid/net/LinkAddress;)V
-Landroid/net/RouteInfo;->getDestinationLinkAddress()Landroid/net/LinkAddress;
-Landroid/net/RouteInfo;->getType()I
-Landroid/net/RouteInfo;->isHostRoute()Z
-Landroid/net/RouteInfo;->isIPv4Default()Z
-Landroid/net/RouteInfo;->isIPv6Default()Z
-Landroid/net/RouteInfo;->makeHostRoute(Ljava/net/InetAddress;Ljava/lang/String;)Landroid/net/RouteInfo;
-Landroid/net/RouteInfo;->makeHostRoute(Ljava/net/InetAddress;Ljava/net/InetAddress;Ljava/lang/String;)Landroid/net/RouteInfo;
-Landroid/net/RouteInfo;->mDestination:Landroid/net/IpPrefix;
-Landroid/net/RouteInfo;->mHasGateway:Z
-Landroid/net/RouteInfo;->mInterface:Ljava/lang/String;
-Landroid/net/RouteInfo;->mType:I
-Landroid/net/RouteInfo;->RTN_THROW:I
-Landroid/net/RouteInfo;->RTN_UNICAST:I
-Landroid/net/RouteInfo;->RTN_UNREACHABLE:I
Landroid/net/RssiCurve;-><init>(Landroid/os/Parcel;)V
Landroid/net/RssiCurve;->DEFAULT_ACTIVE_NETWORK_RSSI_BOOST:I
Landroid/net/rtp/AudioCodec;-><init>(ILjava/lang/String;Ljava/lang/String;)V
@@ -38040,11 +36826,6 @@
Landroid/net/SSLSessionCache;-><init>(Ljava/lang/Object;)V
Landroid/net/SSLSessionCache;->install(Landroid/net/SSLSessionCache;Ljavax/net/ssl/SSLContext;)V
Landroid/net/SSLSessionCache;->TAG:Ljava/lang/String;
-Landroid/net/StaticIpConfiguration;-><init>(Landroid/net/StaticIpConfiguration;)V
-Landroid/net/StaticIpConfiguration;->clear()V
-Landroid/net/StaticIpConfiguration;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/net/StaticIpConfiguration;->readFromParcel(Landroid/net/StaticIpConfiguration;Landroid/os/Parcel;)V
-Landroid/net/StaticIpConfiguration;->toLinkProperties(Ljava/lang/String;)Landroid/net/LinkProperties;
Landroid/net/StringNetworkSpecifier;-><init>(Ljava/lang/String;)V
Landroid/net/StringNetworkSpecifier;->CREATOR:Landroid/os/Parcelable$Creator;
Landroid/net/StringNetworkSpecifier;->satisfiedBy(Landroid/net/NetworkSpecifier;)Z
@@ -38083,15 +36864,6 @@
Landroid/net/TrafficStats;->TYPE_TX_PACKETS:I
Landroid/net/TrafficStats;->UID_REMOVED:I
Landroid/net/TrafficStats;->UID_TETHERING:I
-Landroid/net/UidRange;-><init>(II)V
-Landroid/net/UidRange;->contains(I)Z
-Landroid/net/UidRange;->containsRange(Landroid/net/UidRange;)Z
-Landroid/net/UidRange;->count()I
-Landroid/net/UidRange;->createForUser(I)Landroid/net/UidRange;
-Landroid/net/UidRange;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/net/UidRange;->getStartUser()I
-Landroid/net/UidRange;->start:I
-Landroid/net/UidRange;->stop:I
Landroid/net/Uri$AbstractHierarchicalUri;-><init>()V
Landroid/net/Uri$AbstractHierarchicalUri;->getUserInfoPart()Landroid/net/Uri$Part;
Landroid/net/Uri$AbstractHierarchicalUri;->host:Ljava/lang/String;
@@ -38253,837 +37025,6 @@
Landroid/net/WebAddress;->setAuthInfo(Ljava/lang/String;)V
Landroid/net/WebAddress;->setPort(I)V
Landroid/net/WebAddress;->setScheme(Ljava/lang/String;)V
-Landroid/net/wifi/AnqpInformationElement;-><init>(II[B)V
-Landroid/net/wifi/AnqpInformationElement;->ANQP_3GPP_NETWORK:I
-Landroid/net/wifi/AnqpInformationElement;->ANQP_CAPABILITY_LIST:I
-Landroid/net/wifi/AnqpInformationElement;->ANQP_CIVIC_LOC:I
-Landroid/net/wifi/AnqpInformationElement;->ANQP_DOM_NAME:I
-Landroid/net/wifi/AnqpInformationElement;->ANQP_EMERGENCY_ALERT:I
-Landroid/net/wifi/AnqpInformationElement;->ANQP_EMERGENCY_NAI:I
-Landroid/net/wifi/AnqpInformationElement;->ANQP_EMERGENCY_NUMBER:I
-Landroid/net/wifi/AnqpInformationElement;->ANQP_GEO_LOC:I
-Landroid/net/wifi/AnqpInformationElement;->ANQP_IP_ADDR_AVAILABILITY:I
-Landroid/net/wifi/AnqpInformationElement;->ANQP_LOC_URI:I
-Landroid/net/wifi/AnqpInformationElement;->ANQP_NAI_REALM:I
-Landroid/net/wifi/AnqpInformationElement;->ANQP_NEIGHBOR_REPORT:I
-Landroid/net/wifi/AnqpInformationElement;->ANQP_NWK_AUTH_TYPE:I
-Landroid/net/wifi/AnqpInformationElement;->ANQP_QUERY_LIST:I
-Landroid/net/wifi/AnqpInformationElement;->ANQP_ROAMING_CONSORTIUM:I
-Landroid/net/wifi/AnqpInformationElement;->ANQP_TDLS_CAP:I
-Landroid/net/wifi/AnqpInformationElement;->ANQP_VENDOR_SPEC:I
-Landroid/net/wifi/AnqpInformationElement;->ANQP_VENUE_NAME:I
-Landroid/net/wifi/AnqpInformationElement;->getElementId()I
-Landroid/net/wifi/AnqpInformationElement;->getPayload()[B
-Landroid/net/wifi/AnqpInformationElement;->getVendorId()I
-Landroid/net/wifi/AnqpInformationElement;->HOTSPOT20_VENDOR_ID:I
-Landroid/net/wifi/AnqpInformationElement;->HS_CAPABILITY_LIST:I
-Landroid/net/wifi/AnqpInformationElement;->HS_CONN_CAPABILITY:I
-Landroid/net/wifi/AnqpInformationElement;->HS_FRIENDLY_NAME:I
-Landroid/net/wifi/AnqpInformationElement;->HS_ICON_FILE:I
-Landroid/net/wifi/AnqpInformationElement;->HS_ICON_REQUEST:I
-Landroid/net/wifi/AnqpInformationElement;->HS_NAI_HOME_REALM_QUERY:I
-Landroid/net/wifi/AnqpInformationElement;->HS_OPERATING_CLASS:I
-Landroid/net/wifi/AnqpInformationElement;->HS_OSU_PROVIDERS:I
-Landroid/net/wifi/AnqpInformationElement;->HS_QUERY_LIST:I
-Landroid/net/wifi/AnqpInformationElement;->HS_WAN_METRICS:I
-Landroid/net/wifi/AnqpInformationElement;->mElementId:I
-Landroid/net/wifi/AnqpInformationElement;->mPayload:[B
-Landroid/net/wifi/AnqpInformationElement;->mVendorId:I
-Landroid/net/wifi/aware/Characteristics;-><init>(Landroid/os/Bundle;)V
-Landroid/net/wifi/aware/Characteristics;->KEY_MAX_MATCH_FILTER_LENGTH:Ljava/lang/String;
-Landroid/net/wifi/aware/Characteristics;->KEY_MAX_SERVICE_NAME_LENGTH:Ljava/lang/String;
-Landroid/net/wifi/aware/Characteristics;->KEY_MAX_SERVICE_SPECIFIC_INFO_LENGTH:Ljava/lang/String;
-Landroid/net/wifi/aware/Characteristics;->mCharacteristics:Landroid/os/Bundle;
-Landroid/net/wifi/aware/ConfigRequest$Builder;-><init>()V
-Landroid/net/wifi/aware/ConfigRequest$Builder;->build()Landroid/net/wifi/aware/ConfigRequest;
-Landroid/net/wifi/aware/ConfigRequest$Builder;->mClusterHigh:I
-Landroid/net/wifi/aware/ConfigRequest$Builder;->mClusterLow:I
-Landroid/net/wifi/aware/ConfigRequest$Builder;->mDiscoveryWindowInterval:[I
-Landroid/net/wifi/aware/ConfigRequest$Builder;->mMasterPreference:I
-Landroid/net/wifi/aware/ConfigRequest$Builder;->mSupport5gBand:Z
-Landroid/net/wifi/aware/ConfigRequest$Builder;->setClusterHigh(I)Landroid/net/wifi/aware/ConfigRequest$Builder;
-Landroid/net/wifi/aware/ConfigRequest$Builder;->setClusterLow(I)Landroid/net/wifi/aware/ConfigRequest$Builder;
-Landroid/net/wifi/aware/ConfigRequest$Builder;->setDiscoveryWindowInterval(II)Landroid/net/wifi/aware/ConfigRequest$Builder;
-Landroid/net/wifi/aware/ConfigRequest$Builder;->setMasterPreference(I)Landroid/net/wifi/aware/ConfigRequest$Builder;
-Landroid/net/wifi/aware/ConfigRequest$Builder;->setSupport5gBand(Z)Landroid/net/wifi/aware/ConfigRequest$Builder;
-Landroid/net/wifi/aware/ConfigRequest;-><init>(ZIII[I)V
-Landroid/net/wifi/aware/ConfigRequest;->CLUSTER_ID_MAX:I
-Landroid/net/wifi/aware/ConfigRequest;->CLUSTER_ID_MIN:I
-Landroid/net/wifi/aware/ConfigRequest;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/net/wifi/aware/ConfigRequest;->DW_DISABLE:I
-Landroid/net/wifi/aware/ConfigRequest;->DW_INTERVAL_NOT_INIT:I
-Landroid/net/wifi/aware/ConfigRequest;->mClusterHigh:I
-Landroid/net/wifi/aware/ConfigRequest;->mClusterLow:I
-Landroid/net/wifi/aware/ConfigRequest;->mDiscoveryWindowInterval:[I
-Landroid/net/wifi/aware/ConfigRequest;->mMasterPreference:I
-Landroid/net/wifi/aware/ConfigRequest;->mSupport5gBand:Z
-Landroid/net/wifi/aware/ConfigRequest;->NAN_BAND_24GHZ:I
-Landroid/net/wifi/aware/ConfigRequest;->NAN_BAND_5GHZ:I
-Landroid/net/wifi/aware/ConfigRequest;->validate()V
-Landroid/net/wifi/aware/DiscoverySession;-><init>(Landroid/net/wifi/aware/WifiAwareManager;II)V
-Landroid/net/wifi/aware/DiscoverySession;->DBG:Z
-Landroid/net/wifi/aware/DiscoverySession;->getClientId()I
-Landroid/net/wifi/aware/DiscoverySession;->getMaxSendRetryCount()I
-Landroid/net/wifi/aware/DiscoverySession;->getSessionId()I
-Landroid/net/wifi/aware/DiscoverySession;->MAX_SEND_RETRY_COUNT:I
-Landroid/net/wifi/aware/DiscoverySession;->mClientId:I
-Landroid/net/wifi/aware/DiscoverySession;->mCloseGuard:Ldalvik/system/CloseGuard;
-Landroid/net/wifi/aware/DiscoverySession;->mMgr:Ljava/lang/ref/WeakReference;
-Landroid/net/wifi/aware/DiscoverySession;->mSessionId:I
-Landroid/net/wifi/aware/DiscoverySession;->mTerminated:Z
-Landroid/net/wifi/aware/DiscoverySession;->sendMessage(Landroid/net/wifi/aware/PeerHandle;I[BI)V
-Landroid/net/wifi/aware/DiscoverySession;->setTerminated()V
-Landroid/net/wifi/aware/DiscoverySession;->TAG:Ljava/lang/String;
-Landroid/net/wifi/aware/DiscoverySession;->VDBG:Z
-Landroid/net/wifi/aware/IWifiAwareDiscoverySessionCallback$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/net/wifi/aware/IWifiAwareDiscoverySessionCallback$Stub$Proxy;->getInterfaceDescriptor()Ljava/lang/String;
-Landroid/net/wifi/aware/IWifiAwareDiscoverySessionCallback$Stub$Proxy;->mRemote:Landroid/os/IBinder;
-Landroid/net/wifi/aware/IWifiAwareDiscoverySessionCallback$Stub$Proxy;->onMatch(I[B[B)V
-Landroid/net/wifi/aware/IWifiAwareDiscoverySessionCallback$Stub$Proxy;->onMatchWithDistance(I[B[BI)V
-Landroid/net/wifi/aware/IWifiAwareDiscoverySessionCallback$Stub$Proxy;->onMessageReceived(I[B)V
-Landroid/net/wifi/aware/IWifiAwareDiscoverySessionCallback$Stub$Proxy;->onMessageSendFail(II)V
-Landroid/net/wifi/aware/IWifiAwareDiscoverySessionCallback$Stub$Proxy;->onMessageSendSuccess(I)V
-Landroid/net/wifi/aware/IWifiAwareDiscoverySessionCallback$Stub$Proxy;->onSessionConfigFail(I)V
-Landroid/net/wifi/aware/IWifiAwareDiscoverySessionCallback$Stub$Proxy;->onSessionConfigSuccess()V
-Landroid/net/wifi/aware/IWifiAwareDiscoverySessionCallback$Stub$Proxy;->onSessionStarted(I)V
-Landroid/net/wifi/aware/IWifiAwareDiscoverySessionCallback$Stub$Proxy;->onSessionTerminated(I)V
-Landroid/net/wifi/aware/IWifiAwareDiscoverySessionCallback$Stub;-><init>()V
-Landroid/net/wifi/aware/IWifiAwareDiscoverySessionCallback$Stub;->asInterface(Landroid/os/IBinder;)Landroid/net/wifi/aware/IWifiAwareDiscoverySessionCallback;
-Landroid/net/wifi/aware/IWifiAwareDiscoverySessionCallback$Stub;->DESCRIPTOR:Ljava/lang/String;
-Landroid/net/wifi/aware/IWifiAwareDiscoverySessionCallback$Stub;->TRANSACTION_onMatch:I
-Landroid/net/wifi/aware/IWifiAwareDiscoverySessionCallback$Stub;->TRANSACTION_onMatchWithDistance:I
-Landroid/net/wifi/aware/IWifiAwareDiscoverySessionCallback$Stub;->TRANSACTION_onMessageReceived:I
-Landroid/net/wifi/aware/IWifiAwareDiscoverySessionCallback$Stub;->TRANSACTION_onMessageSendFail:I
-Landroid/net/wifi/aware/IWifiAwareDiscoverySessionCallback$Stub;->TRANSACTION_onMessageSendSuccess:I
-Landroid/net/wifi/aware/IWifiAwareDiscoverySessionCallback$Stub;->TRANSACTION_onSessionConfigFail:I
-Landroid/net/wifi/aware/IWifiAwareDiscoverySessionCallback$Stub;->TRANSACTION_onSessionConfigSuccess:I
-Landroid/net/wifi/aware/IWifiAwareDiscoverySessionCallback$Stub;->TRANSACTION_onSessionStarted:I
-Landroid/net/wifi/aware/IWifiAwareDiscoverySessionCallback$Stub;->TRANSACTION_onSessionTerminated:I
-Landroid/net/wifi/aware/IWifiAwareDiscoverySessionCallback;->onMatch(I[B[B)V
-Landroid/net/wifi/aware/IWifiAwareDiscoverySessionCallback;->onMatchWithDistance(I[B[BI)V
-Landroid/net/wifi/aware/IWifiAwareDiscoverySessionCallback;->onMessageReceived(I[B)V
-Landroid/net/wifi/aware/IWifiAwareDiscoverySessionCallback;->onMessageSendFail(II)V
-Landroid/net/wifi/aware/IWifiAwareDiscoverySessionCallback;->onMessageSendSuccess(I)V
-Landroid/net/wifi/aware/IWifiAwareDiscoverySessionCallback;->onSessionConfigFail(I)V
-Landroid/net/wifi/aware/IWifiAwareDiscoverySessionCallback;->onSessionConfigSuccess()V
-Landroid/net/wifi/aware/IWifiAwareDiscoverySessionCallback;->onSessionStarted(I)V
-Landroid/net/wifi/aware/IWifiAwareDiscoverySessionCallback;->onSessionTerminated(I)V
-Landroid/net/wifi/aware/IWifiAwareEventCallback$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/net/wifi/aware/IWifiAwareEventCallback$Stub$Proxy;->getInterfaceDescriptor()Ljava/lang/String;
-Landroid/net/wifi/aware/IWifiAwareEventCallback$Stub$Proxy;->mRemote:Landroid/os/IBinder;
-Landroid/net/wifi/aware/IWifiAwareEventCallback$Stub$Proxy;->onConnectFail(I)V
-Landroid/net/wifi/aware/IWifiAwareEventCallback$Stub$Proxy;->onConnectSuccess(I)V
-Landroid/net/wifi/aware/IWifiAwareEventCallback$Stub$Proxy;->onIdentityChanged([B)V
-Landroid/net/wifi/aware/IWifiAwareEventCallback$Stub;-><init>()V
-Landroid/net/wifi/aware/IWifiAwareEventCallback$Stub;->asInterface(Landroid/os/IBinder;)Landroid/net/wifi/aware/IWifiAwareEventCallback;
-Landroid/net/wifi/aware/IWifiAwareEventCallback$Stub;->DESCRIPTOR:Ljava/lang/String;
-Landroid/net/wifi/aware/IWifiAwareEventCallback$Stub;->TRANSACTION_onConnectFail:I
-Landroid/net/wifi/aware/IWifiAwareEventCallback$Stub;->TRANSACTION_onConnectSuccess:I
-Landroid/net/wifi/aware/IWifiAwareEventCallback$Stub;->TRANSACTION_onIdentityChanged:I
-Landroid/net/wifi/aware/IWifiAwareEventCallback;->onConnectFail(I)V
-Landroid/net/wifi/aware/IWifiAwareEventCallback;->onConnectSuccess(I)V
-Landroid/net/wifi/aware/IWifiAwareEventCallback;->onIdentityChanged([B)V
-Landroid/net/wifi/aware/IWifiAwareMacAddressProvider$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/net/wifi/aware/IWifiAwareMacAddressProvider$Stub$Proxy;->getInterfaceDescriptor()Ljava/lang/String;
-Landroid/net/wifi/aware/IWifiAwareMacAddressProvider$Stub$Proxy;->macAddress(Ljava/util/Map;)V
-Landroid/net/wifi/aware/IWifiAwareMacAddressProvider$Stub$Proxy;->mRemote:Landroid/os/IBinder;
-Landroid/net/wifi/aware/IWifiAwareMacAddressProvider$Stub;-><init>()V
-Landroid/net/wifi/aware/IWifiAwareMacAddressProvider$Stub;->asInterface(Landroid/os/IBinder;)Landroid/net/wifi/aware/IWifiAwareMacAddressProvider;
-Landroid/net/wifi/aware/IWifiAwareMacAddressProvider$Stub;->DESCRIPTOR:Ljava/lang/String;
-Landroid/net/wifi/aware/IWifiAwareMacAddressProvider$Stub;->TRANSACTION_macAddress:I
-Landroid/net/wifi/aware/IWifiAwareMacAddressProvider;->macAddress(Ljava/util/Map;)V
-Landroid/net/wifi/aware/IWifiAwareManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/net/wifi/aware/IWifiAwareManager$Stub$Proxy;->connect(Landroid/os/IBinder;Ljava/lang/String;Landroid/net/wifi/aware/IWifiAwareEventCallback;Landroid/net/wifi/aware/ConfigRequest;Z)V
-Landroid/net/wifi/aware/IWifiAwareManager$Stub$Proxy;->disconnect(ILandroid/os/IBinder;)V
-Landroid/net/wifi/aware/IWifiAwareManager$Stub$Proxy;->getCharacteristics()Landroid/net/wifi/aware/Characteristics;
-Landroid/net/wifi/aware/IWifiAwareManager$Stub$Proxy;->getInterfaceDescriptor()Ljava/lang/String;
-Landroid/net/wifi/aware/IWifiAwareManager$Stub$Proxy;->isUsageEnabled()Z
-Landroid/net/wifi/aware/IWifiAwareManager$Stub$Proxy;->mRemote:Landroid/os/IBinder;
-Landroid/net/wifi/aware/IWifiAwareManager$Stub$Proxy;->publish(Ljava/lang/String;ILandroid/net/wifi/aware/PublishConfig;Landroid/net/wifi/aware/IWifiAwareDiscoverySessionCallback;)V
-Landroid/net/wifi/aware/IWifiAwareManager$Stub$Proxy;->requestMacAddresses(ILjava/util/List;Landroid/net/wifi/aware/IWifiAwareMacAddressProvider;)V
-Landroid/net/wifi/aware/IWifiAwareManager$Stub$Proxy;->sendMessage(III[BII)V
-Landroid/net/wifi/aware/IWifiAwareManager$Stub$Proxy;->subscribe(Ljava/lang/String;ILandroid/net/wifi/aware/SubscribeConfig;Landroid/net/wifi/aware/IWifiAwareDiscoverySessionCallback;)V
-Landroid/net/wifi/aware/IWifiAwareManager$Stub$Proxy;->terminateSession(II)V
-Landroid/net/wifi/aware/IWifiAwareManager$Stub$Proxy;->updatePublish(IILandroid/net/wifi/aware/PublishConfig;)V
-Landroid/net/wifi/aware/IWifiAwareManager$Stub$Proxy;->updateSubscribe(IILandroid/net/wifi/aware/SubscribeConfig;)V
-Landroid/net/wifi/aware/IWifiAwareManager$Stub;-><init>()V
-Landroid/net/wifi/aware/IWifiAwareManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/net/wifi/aware/IWifiAwareManager;
-Landroid/net/wifi/aware/IWifiAwareManager$Stub;->DESCRIPTOR:Ljava/lang/String;
-Landroid/net/wifi/aware/IWifiAwareManager$Stub;->TRANSACTION_connect:I
-Landroid/net/wifi/aware/IWifiAwareManager$Stub;->TRANSACTION_disconnect:I
-Landroid/net/wifi/aware/IWifiAwareManager$Stub;->TRANSACTION_getCharacteristics:I
-Landroid/net/wifi/aware/IWifiAwareManager$Stub;->TRANSACTION_isUsageEnabled:I
-Landroid/net/wifi/aware/IWifiAwareManager$Stub;->TRANSACTION_publish:I
-Landroid/net/wifi/aware/IWifiAwareManager$Stub;->TRANSACTION_requestMacAddresses:I
-Landroid/net/wifi/aware/IWifiAwareManager$Stub;->TRANSACTION_sendMessage:I
-Landroid/net/wifi/aware/IWifiAwareManager$Stub;->TRANSACTION_subscribe:I
-Landroid/net/wifi/aware/IWifiAwareManager$Stub;->TRANSACTION_terminateSession:I
-Landroid/net/wifi/aware/IWifiAwareManager$Stub;->TRANSACTION_updatePublish:I
-Landroid/net/wifi/aware/IWifiAwareManager$Stub;->TRANSACTION_updateSubscribe:I
-Landroid/net/wifi/aware/IWifiAwareManager;->connect(Landroid/os/IBinder;Ljava/lang/String;Landroid/net/wifi/aware/IWifiAwareEventCallback;Landroid/net/wifi/aware/ConfigRequest;Z)V
-Landroid/net/wifi/aware/IWifiAwareManager;->disconnect(ILandroid/os/IBinder;)V
-Landroid/net/wifi/aware/IWifiAwareManager;->getCharacteristics()Landroid/net/wifi/aware/Characteristics;
-Landroid/net/wifi/aware/IWifiAwareManager;->isUsageEnabled()Z
-Landroid/net/wifi/aware/IWifiAwareManager;->publish(Ljava/lang/String;ILandroid/net/wifi/aware/PublishConfig;Landroid/net/wifi/aware/IWifiAwareDiscoverySessionCallback;)V
-Landroid/net/wifi/aware/IWifiAwareManager;->requestMacAddresses(ILjava/util/List;Landroid/net/wifi/aware/IWifiAwareMacAddressProvider;)V
-Landroid/net/wifi/aware/IWifiAwareManager;->sendMessage(III[BII)V
-Landroid/net/wifi/aware/IWifiAwareManager;->subscribe(Ljava/lang/String;ILandroid/net/wifi/aware/SubscribeConfig;Landroid/net/wifi/aware/IWifiAwareDiscoverySessionCallback;)V
-Landroid/net/wifi/aware/IWifiAwareManager;->terminateSession(II)V
-Landroid/net/wifi/aware/IWifiAwareManager;->updatePublish(IILandroid/net/wifi/aware/PublishConfig;)V
-Landroid/net/wifi/aware/IWifiAwareManager;->updateSubscribe(IILandroid/net/wifi/aware/SubscribeConfig;)V
-Landroid/net/wifi/aware/PeerHandle;-><init>(I)V
-Landroid/net/wifi/aware/PeerHandle;->peerId:I
-Landroid/net/wifi/aware/PublishConfig$Builder;->mEnableRanging:Z
-Landroid/net/wifi/aware/PublishConfig$Builder;->mEnableTerminateNotification:Z
-Landroid/net/wifi/aware/PublishConfig$Builder;->mMatchFilter:[B
-Landroid/net/wifi/aware/PublishConfig$Builder;->mPublishType:I
-Landroid/net/wifi/aware/PublishConfig$Builder;->mServiceName:[B
-Landroid/net/wifi/aware/PublishConfig$Builder;->mServiceSpecificInfo:[B
-Landroid/net/wifi/aware/PublishConfig$Builder;->mTtlSec:I
-Landroid/net/wifi/aware/PublishConfig;-><init>([B[B[BIIZZ)V
-Landroid/net/wifi/aware/PublishConfig;->assertValid(Landroid/net/wifi/aware/Characteristics;Z)V
-Landroid/net/wifi/aware/PublishConfig;->mEnableRanging:Z
-Landroid/net/wifi/aware/PublishConfig;->mEnableTerminateNotification:Z
-Landroid/net/wifi/aware/PublishConfig;->mMatchFilter:[B
-Landroid/net/wifi/aware/PublishConfig;->mPublishType:I
-Landroid/net/wifi/aware/PublishConfig;->mServiceName:[B
-Landroid/net/wifi/aware/PublishConfig;->mServiceSpecificInfo:[B
-Landroid/net/wifi/aware/PublishConfig;->mTtlSec:I
-Landroid/net/wifi/aware/PublishDiscoverySession;-><init>(Landroid/net/wifi/aware/WifiAwareManager;II)V
-Landroid/net/wifi/aware/PublishDiscoverySession;->TAG:Ljava/lang/String;
-Landroid/net/wifi/aware/SubscribeConfig$Builder;->mEnableTerminateNotification:Z
-Landroid/net/wifi/aware/SubscribeConfig$Builder;->mMatchFilter:[B
-Landroid/net/wifi/aware/SubscribeConfig$Builder;->mMaxDistanceMm:I
-Landroid/net/wifi/aware/SubscribeConfig$Builder;->mMaxDistanceMmSet:Z
-Landroid/net/wifi/aware/SubscribeConfig$Builder;->mMinDistanceMm:I
-Landroid/net/wifi/aware/SubscribeConfig$Builder;->mMinDistanceMmSet:Z
-Landroid/net/wifi/aware/SubscribeConfig$Builder;->mServiceName:[B
-Landroid/net/wifi/aware/SubscribeConfig$Builder;->mServiceSpecificInfo:[B
-Landroid/net/wifi/aware/SubscribeConfig$Builder;->mSubscribeType:I
-Landroid/net/wifi/aware/SubscribeConfig$Builder;->mTtlSec:I
-Landroid/net/wifi/aware/SubscribeConfig;-><init>([B[B[BIIZZIZI)V
-Landroid/net/wifi/aware/SubscribeConfig;->assertValid(Landroid/net/wifi/aware/Characteristics;Z)V
-Landroid/net/wifi/aware/SubscribeConfig;->mEnableTerminateNotification:Z
-Landroid/net/wifi/aware/SubscribeConfig;->mMatchFilter:[B
-Landroid/net/wifi/aware/SubscribeConfig;->mMaxDistanceMm:I
-Landroid/net/wifi/aware/SubscribeConfig;->mMaxDistanceMmSet:Z
-Landroid/net/wifi/aware/SubscribeConfig;->mMinDistanceMm:I
-Landroid/net/wifi/aware/SubscribeConfig;->mMinDistanceMmSet:Z
-Landroid/net/wifi/aware/SubscribeConfig;->mServiceName:[B
-Landroid/net/wifi/aware/SubscribeConfig;->mServiceSpecificInfo:[B
-Landroid/net/wifi/aware/SubscribeConfig;->mSubscribeType:I
-Landroid/net/wifi/aware/SubscribeConfig;->mTtlSec:I
-Landroid/net/wifi/aware/SubscribeDiscoverySession;-><init>(Landroid/net/wifi/aware/WifiAwareManager;II)V
-Landroid/net/wifi/aware/SubscribeDiscoverySession;->TAG:Ljava/lang/String;
-Landroid/net/wifi/aware/TlvBufferUtils$TlvConstructor;-><init>(II)V
-Landroid/net/wifi/aware/TlvBufferUtils$TlvConstructor;->addHeader(II)V
-Landroid/net/wifi/aware/TlvBufferUtils$TlvConstructor;->allocate(I)Landroid/net/wifi/aware/TlvBufferUtils$TlvConstructor;
-Landroid/net/wifi/aware/TlvBufferUtils$TlvConstructor;->allocateAndPut(Ljava/util/List;)Landroid/net/wifi/aware/TlvBufferUtils$TlvConstructor;
-Landroid/net/wifi/aware/TlvBufferUtils$TlvConstructor;->checkLength(I)V
-Landroid/net/wifi/aware/TlvBufferUtils$TlvConstructor;->getActualLength()I
-Landroid/net/wifi/aware/TlvBufferUtils$TlvConstructor;->getArray()[B
-Landroid/net/wifi/aware/TlvBufferUtils$TlvConstructor;->mArray:[B
-Landroid/net/wifi/aware/TlvBufferUtils$TlvConstructor;->mArrayLength:I
-Landroid/net/wifi/aware/TlvBufferUtils$TlvConstructor;->mLengthSize:I
-Landroid/net/wifi/aware/TlvBufferUtils$TlvConstructor;->mPosition:I
-Landroid/net/wifi/aware/TlvBufferUtils$TlvConstructor;->mTypeSize:I
-Landroid/net/wifi/aware/TlvBufferUtils$TlvConstructor;->putByte(IB)Landroid/net/wifi/aware/TlvBufferUtils$TlvConstructor;
-Landroid/net/wifi/aware/TlvBufferUtils$TlvConstructor;->putByteArray(I[B)Landroid/net/wifi/aware/TlvBufferUtils$TlvConstructor;
-Landroid/net/wifi/aware/TlvBufferUtils$TlvConstructor;->putByteArray(I[BII)Landroid/net/wifi/aware/TlvBufferUtils$TlvConstructor;
-Landroid/net/wifi/aware/TlvBufferUtils$TlvConstructor;->putInt(II)Landroid/net/wifi/aware/TlvBufferUtils$TlvConstructor;
-Landroid/net/wifi/aware/TlvBufferUtils$TlvConstructor;->putShort(IS)Landroid/net/wifi/aware/TlvBufferUtils$TlvConstructor;
-Landroid/net/wifi/aware/TlvBufferUtils$TlvConstructor;->putString(ILjava/lang/String;)Landroid/net/wifi/aware/TlvBufferUtils$TlvConstructor;
-Landroid/net/wifi/aware/TlvBufferUtils$TlvConstructor;->putZeroLengthElement(I)Landroid/net/wifi/aware/TlvBufferUtils$TlvConstructor;
-Landroid/net/wifi/aware/TlvBufferUtils$TlvConstructor;->wrap([B)Landroid/net/wifi/aware/TlvBufferUtils$TlvConstructor;
-Landroid/net/wifi/aware/TlvBufferUtils$TlvElement;-><init>(II[BI)V
-Landroid/net/wifi/aware/TlvBufferUtils$TlvElement;->getByte()B
-Landroid/net/wifi/aware/TlvBufferUtils$TlvElement;->getInt()I
-Landroid/net/wifi/aware/TlvBufferUtils$TlvElement;->getShort()S
-Landroid/net/wifi/aware/TlvBufferUtils$TlvElement;->getString()Ljava/lang/String;
-Landroid/net/wifi/aware/TlvBufferUtils$TlvElement;->length:I
-Landroid/net/wifi/aware/TlvBufferUtils$TlvElement;->offset:I
-Landroid/net/wifi/aware/TlvBufferUtils$TlvElement;->refArray:[B
-Landroid/net/wifi/aware/TlvBufferUtils$TlvElement;->type:I
-Landroid/net/wifi/aware/TlvBufferUtils$TlvIterable;-><init>(II[B)V
-Landroid/net/wifi/aware/TlvBufferUtils$TlvIterable;->mArray:[B
-Landroid/net/wifi/aware/TlvBufferUtils$TlvIterable;->mArrayLength:I
-Landroid/net/wifi/aware/TlvBufferUtils$TlvIterable;->mLengthSize:I
-Landroid/net/wifi/aware/TlvBufferUtils$TlvIterable;->mTypeSize:I
-Landroid/net/wifi/aware/TlvBufferUtils$TlvIterable;->toList()Ljava/util/List;
-Landroid/net/wifi/aware/TlvBufferUtils;-><init>()V
-Landroid/net/wifi/aware/TlvBufferUtils;->isValid([BII)Z
-Landroid/net/wifi/aware/WifiAwareAgentNetworkSpecifier$ByteArrayWrapper;-><init>([B)V
-Landroid/net/wifi/aware/WifiAwareAgentNetworkSpecifier$ByteArrayWrapper;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/net/wifi/aware/WifiAwareAgentNetworkSpecifier$ByteArrayWrapper;->mData:[B
-Landroid/net/wifi/aware/WifiAwareAgentNetworkSpecifier;-><init>()V
-Landroid/net/wifi/aware/WifiAwareAgentNetworkSpecifier;-><init>(Landroid/net/wifi/aware/WifiAwareNetworkSpecifier;)V
-Landroid/net/wifi/aware/WifiAwareAgentNetworkSpecifier;-><init>([Landroid/net/wifi/aware/WifiAwareNetworkSpecifier;)V
-Landroid/net/wifi/aware/WifiAwareAgentNetworkSpecifier;->assertValidFromUid(I)V
-Landroid/net/wifi/aware/WifiAwareAgentNetworkSpecifier;->convert(Landroid/net/wifi/aware/WifiAwareNetworkSpecifier;)Landroid/net/wifi/aware/WifiAwareAgentNetworkSpecifier$ByteArrayWrapper;
-Landroid/net/wifi/aware/WifiAwareAgentNetworkSpecifier;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/net/wifi/aware/WifiAwareAgentNetworkSpecifier;->initialize()V
-Landroid/net/wifi/aware/WifiAwareAgentNetworkSpecifier;->isEmpty()Z
-Landroid/net/wifi/aware/WifiAwareAgentNetworkSpecifier;->mDigester:Ljava/security/MessageDigest;
-Landroid/net/wifi/aware/WifiAwareAgentNetworkSpecifier;->mNetworkSpecifiers:Ljava/util/Set;
-Landroid/net/wifi/aware/WifiAwareAgentNetworkSpecifier;->satisfiedBy(Landroid/net/NetworkSpecifier;)Z
-Landroid/net/wifi/aware/WifiAwareAgentNetworkSpecifier;->satisfiesAwareNetworkSpecifier(Landroid/net/wifi/aware/WifiAwareNetworkSpecifier;)Z
-Landroid/net/wifi/aware/WifiAwareAgentNetworkSpecifier;->TAG:Ljava/lang/String;
-Landroid/net/wifi/aware/WifiAwareAgentNetworkSpecifier;->VDBG:Z
-Landroid/net/wifi/aware/WifiAwareManager$WifiAwareDiscoverySessionCallbackProxy;-><init>(Landroid/net/wifi/aware/WifiAwareManager;Landroid/os/Looper;ZLandroid/net/wifi/aware/DiscoverySessionCallback;I)V
-Landroid/net/wifi/aware/WifiAwareManager$WifiAwareDiscoverySessionCallbackProxy;->CALLBACK_MATCH:I
-Landroid/net/wifi/aware/WifiAwareManager$WifiAwareDiscoverySessionCallbackProxy;->CALLBACK_MATCH_WITH_DISTANCE:I
-Landroid/net/wifi/aware/WifiAwareManager$WifiAwareDiscoverySessionCallbackProxy;->CALLBACK_MESSAGE_RECEIVED:I
-Landroid/net/wifi/aware/WifiAwareManager$WifiAwareDiscoverySessionCallbackProxy;->CALLBACK_MESSAGE_SEND_FAIL:I
-Landroid/net/wifi/aware/WifiAwareManager$WifiAwareDiscoverySessionCallbackProxy;->CALLBACK_MESSAGE_SEND_SUCCESS:I
-Landroid/net/wifi/aware/WifiAwareManager$WifiAwareDiscoverySessionCallbackProxy;->CALLBACK_SESSION_CONFIG_FAIL:I
-Landroid/net/wifi/aware/WifiAwareManager$WifiAwareDiscoverySessionCallbackProxy;->CALLBACK_SESSION_CONFIG_SUCCESS:I
-Landroid/net/wifi/aware/WifiAwareManager$WifiAwareDiscoverySessionCallbackProxy;->CALLBACK_SESSION_STARTED:I
-Landroid/net/wifi/aware/WifiAwareManager$WifiAwareDiscoverySessionCallbackProxy;->CALLBACK_SESSION_TERMINATED:I
-Landroid/net/wifi/aware/WifiAwareManager$WifiAwareDiscoverySessionCallbackProxy;->mAwareManager:Ljava/lang/ref/WeakReference;
-Landroid/net/wifi/aware/WifiAwareManager$WifiAwareDiscoverySessionCallbackProxy;->mClientId:I
-Landroid/net/wifi/aware/WifiAwareManager$WifiAwareDiscoverySessionCallbackProxy;->MESSAGE_BUNDLE_KEY_MESSAGE2:Ljava/lang/String;
-Landroid/net/wifi/aware/WifiAwareManager$WifiAwareDiscoverySessionCallbackProxy;->MESSAGE_BUNDLE_KEY_MESSAGE:Ljava/lang/String;
-Landroid/net/wifi/aware/WifiAwareManager$WifiAwareDiscoverySessionCallbackProxy;->mHandler:Landroid/os/Handler;
-Landroid/net/wifi/aware/WifiAwareManager$WifiAwareDiscoverySessionCallbackProxy;->mIsPublish:Z
-Landroid/net/wifi/aware/WifiAwareManager$WifiAwareDiscoverySessionCallbackProxy;->mOriginalCallback:Landroid/net/wifi/aware/DiscoverySessionCallback;
-Landroid/net/wifi/aware/WifiAwareManager$WifiAwareDiscoverySessionCallbackProxy;->mSession:Landroid/net/wifi/aware/DiscoverySession;
-Landroid/net/wifi/aware/WifiAwareManager$WifiAwareDiscoverySessionCallbackProxy;->onMatch(I[B[B)V
-Landroid/net/wifi/aware/WifiAwareManager$WifiAwareDiscoverySessionCallbackProxy;->onMatchCommon(II[B[BI)V
-Landroid/net/wifi/aware/WifiAwareManager$WifiAwareDiscoverySessionCallbackProxy;->onMatchWithDistance(I[B[BI)V
-Landroid/net/wifi/aware/WifiAwareManager$WifiAwareDiscoverySessionCallbackProxy;->onMessageReceived(I[B)V
-Landroid/net/wifi/aware/WifiAwareManager$WifiAwareDiscoverySessionCallbackProxy;->onMessageSendFail(II)V
-Landroid/net/wifi/aware/WifiAwareManager$WifiAwareDiscoverySessionCallbackProxy;->onMessageSendSuccess(I)V
-Landroid/net/wifi/aware/WifiAwareManager$WifiAwareDiscoverySessionCallbackProxy;->onProxySessionStarted(I)V
-Landroid/net/wifi/aware/WifiAwareManager$WifiAwareDiscoverySessionCallbackProxy;->onProxySessionTerminated(I)V
-Landroid/net/wifi/aware/WifiAwareManager$WifiAwareDiscoverySessionCallbackProxy;->onSessionConfigFail(I)V
-Landroid/net/wifi/aware/WifiAwareManager$WifiAwareDiscoverySessionCallbackProxy;->onSessionConfigSuccess()V
-Landroid/net/wifi/aware/WifiAwareManager$WifiAwareDiscoverySessionCallbackProxy;->onSessionStarted(I)V
-Landroid/net/wifi/aware/WifiAwareManager$WifiAwareDiscoverySessionCallbackProxy;->onSessionTerminated(I)V
-Landroid/net/wifi/aware/WifiAwareManager$WifiAwareEventCallbackProxy;-><init>(Landroid/net/wifi/aware/WifiAwareManager;Landroid/os/Looper;Landroid/os/Binder;Landroid/net/wifi/aware/AttachCallback;Landroid/net/wifi/aware/IdentityChangedListener;)V
-Landroid/net/wifi/aware/WifiAwareManager$WifiAwareEventCallbackProxy;->CALLBACK_CONNECT_FAIL:I
-Landroid/net/wifi/aware/WifiAwareManager$WifiAwareEventCallbackProxy;->CALLBACK_CONNECT_SUCCESS:I
-Landroid/net/wifi/aware/WifiAwareManager$WifiAwareEventCallbackProxy;->CALLBACK_IDENTITY_CHANGED:I
-Landroid/net/wifi/aware/WifiAwareManager$WifiAwareEventCallbackProxy;->mAwareManager:Ljava/lang/ref/WeakReference;
-Landroid/net/wifi/aware/WifiAwareManager$WifiAwareEventCallbackProxy;->mBinder:Landroid/os/Binder;
-Landroid/net/wifi/aware/WifiAwareManager$WifiAwareEventCallbackProxy;->mHandler:Landroid/os/Handler;
-Landroid/net/wifi/aware/WifiAwareManager$WifiAwareEventCallbackProxy;->mLooper:Landroid/os/Looper;
-Landroid/net/wifi/aware/WifiAwareManager$WifiAwareEventCallbackProxy;->onConnectFail(I)V
-Landroid/net/wifi/aware/WifiAwareManager$WifiAwareEventCallbackProxy;->onConnectSuccess(I)V
-Landroid/net/wifi/aware/WifiAwareManager$WifiAwareEventCallbackProxy;->onIdentityChanged([B)V
-Landroid/net/wifi/aware/WifiAwareManager;-><init>(Landroid/content/Context;Landroid/net/wifi/aware/IWifiAwareManager;)V
-Landroid/net/wifi/aware/WifiAwareManager;->attach(Landroid/os/Handler;Landroid/net/wifi/aware/ConfigRequest;Landroid/net/wifi/aware/AttachCallback;Landroid/net/wifi/aware/IdentityChangedListener;)V
-Landroid/net/wifi/aware/WifiAwareManager;->createNetworkSpecifier(IIILandroid/net/wifi/aware/PeerHandle;[BLjava/lang/String;)Landroid/net/NetworkSpecifier;
-Landroid/net/wifi/aware/WifiAwareManager;->createNetworkSpecifier(II[B[BLjava/lang/String;)Landroid/net/NetworkSpecifier;
-Landroid/net/wifi/aware/WifiAwareManager;->DBG:Z
-Landroid/net/wifi/aware/WifiAwareManager;->disconnect(ILandroid/os/Binder;)V
-Landroid/net/wifi/aware/WifiAwareManager;->mContext:Landroid/content/Context;
-Landroid/net/wifi/aware/WifiAwareManager;->mLock:Ljava/lang/Object;
-Landroid/net/wifi/aware/WifiAwareManager;->mService:Landroid/net/wifi/aware/IWifiAwareManager;
-Landroid/net/wifi/aware/WifiAwareManager;->publish(ILandroid/os/Looper;Landroid/net/wifi/aware/PublishConfig;Landroid/net/wifi/aware/DiscoverySessionCallback;)V
-Landroid/net/wifi/aware/WifiAwareManager;->sendMessage(IILandroid/net/wifi/aware/PeerHandle;[BII)V
-Landroid/net/wifi/aware/WifiAwareManager;->subscribe(ILandroid/os/Looper;Landroid/net/wifi/aware/SubscribeConfig;Landroid/net/wifi/aware/DiscoverySessionCallback;)V
-Landroid/net/wifi/aware/WifiAwareManager;->TAG:Ljava/lang/String;
-Landroid/net/wifi/aware/WifiAwareManager;->terminateSession(II)V
-Landroid/net/wifi/aware/WifiAwareManager;->updatePublish(IILandroid/net/wifi/aware/PublishConfig;)V
-Landroid/net/wifi/aware/WifiAwareManager;->updateSubscribe(IILandroid/net/wifi/aware/SubscribeConfig;)V
-Landroid/net/wifi/aware/WifiAwareManager;->VDBG:Z
-Landroid/net/wifi/aware/WifiAwareNetworkSpecifier;-><init>(IIIII[B[BLjava/lang/String;I)V
-Landroid/net/wifi/aware/WifiAwareNetworkSpecifier;->assertValidFromUid(I)V
-Landroid/net/wifi/aware/WifiAwareNetworkSpecifier;->clientId:I
-Landroid/net/wifi/aware/WifiAwareNetworkSpecifier;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/net/wifi/aware/WifiAwareNetworkSpecifier;->isOutOfBand()Z
-Landroid/net/wifi/aware/WifiAwareNetworkSpecifier;->NETWORK_SPECIFIER_TYPE_IB:I
-Landroid/net/wifi/aware/WifiAwareNetworkSpecifier;->NETWORK_SPECIFIER_TYPE_IB_ANY_PEER:I
-Landroid/net/wifi/aware/WifiAwareNetworkSpecifier;->NETWORK_SPECIFIER_TYPE_MAX_VALID:I
-Landroid/net/wifi/aware/WifiAwareNetworkSpecifier;->NETWORK_SPECIFIER_TYPE_OOB:I
-Landroid/net/wifi/aware/WifiAwareNetworkSpecifier;->NETWORK_SPECIFIER_TYPE_OOB_ANY_PEER:I
-Landroid/net/wifi/aware/WifiAwareNetworkSpecifier;->passphrase:Ljava/lang/String;
-Landroid/net/wifi/aware/WifiAwareNetworkSpecifier;->peerId:I
-Landroid/net/wifi/aware/WifiAwareNetworkSpecifier;->peerMac:[B
-Landroid/net/wifi/aware/WifiAwareNetworkSpecifier;->pmk:[B
-Landroid/net/wifi/aware/WifiAwareNetworkSpecifier;->requestorUid:I
-Landroid/net/wifi/aware/WifiAwareNetworkSpecifier;->role:I
-Landroid/net/wifi/aware/WifiAwareNetworkSpecifier;->satisfiedBy(Landroid/net/NetworkSpecifier;)Z
-Landroid/net/wifi/aware/WifiAwareNetworkSpecifier;->sessionId:I
-Landroid/net/wifi/aware/WifiAwareNetworkSpecifier;->type:I
-Landroid/net/wifi/aware/WifiAwareSession;-><init>(Landroid/net/wifi/aware/WifiAwareManager;Landroid/os/Binder;I)V
-Landroid/net/wifi/aware/WifiAwareSession;->DBG:Z
-Landroid/net/wifi/aware/WifiAwareSession;->getClientId()I
-Landroid/net/wifi/aware/WifiAwareSession;->mBinder:Landroid/os/Binder;
-Landroid/net/wifi/aware/WifiAwareSession;->mClientId:I
-Landroid/net/wifi/aware/WifiAwareSession;->mCloseGuard:Ldalvik/system/CloseGuard;
-Landroid/net/wifi/aware/WifiAwareSession;->mMgr:Ljava/lang/ref/WeakReference;
-Landroid/net/wifi/aware/WifiAwareSession;->mTerminated:Z
-Landroid/net/wifi/aware/WifiAwareSession;->TAG:Ljava/lang/String;
-Landroid/net/wifi/aware/WifiAwareSession;->VDBG:Z
-Landroid/net/wifi/aware/WifiAwareUtils;-><init>()V
-Landroid/net/wifi/aware/WifiAwareUtils;->isLegacyVersion(Landroid/content/Context;I)Z
-Landroid/net/wifi/aware/WifiAwareUtils;->validatePassphrase(Ljava/lang/String;)Z
-Landroid/net/wifi/aware/WifiAwareUtils;->validatePmk([B)Z
-Landroid/net/wifi/aware/WifiAwareUtils;->validateServiceName([B)V
-Landroid/net/wifi/BatchedScanResult;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/net/wifi/BatchedScanResult;->TAG:Ljava/lang/String;
-Landroid/net/wifi/EAPConstants;-><init>()V
-Landroid/net/wifi/EAPConstants;->EAP_3Com:I
-Landroid/net/wifi/EAPConstants;->EAP_ActiontecWireless:I
-Landroid/net/wifi/EAPConstants;->EAP_AKA:I
-Landroid/net/wifi/EAPConstants;->EAP_AKA_PRIME:I
-Landroid/net/wifi/EAPConstants;->EAP_EKE:I
-Landroid/net/wifi/EAPConstants;->EAP_FAST:I
-Landroid/net/wifi/EAPConstants;->EAP_GPSK:I
-Landroid/net/wifi/EAPConstants;->EAP_HTTPDigest:I
-Landroid/net/wifi/EAPConstants;->EAP_IKEv2:I
-Landroid/net/wifi/EAPConstants;->EAP_KEA:I
-Landroid/net/wifi/EAPConstants;->EAP_KEA_VALIDATE:I
-Landroid/net/wifi/EAPConstants;->EAP_LEAP:I
-Landroid/net/wifi/EAPConstants;->EAP_Link:I
-Landroid/net/wifi/EAPConstants;->EAP_MD5:I
-Landroid/net/wifi/EAPConstants;->EAP_MOBAC:I
-Landroid/net/wifi/EAPConstants;->EAP_MSCHAPv2:I
-Landroid/net/wifi/EAPConstants;->EAP_OTP:I
-Landroid/net/wifi/EAPConstants;->EAP_PAX:I
-Landroid/net/wifi/EAPConstants;->EAP_PEAP:I
-Landroid/net/wifi/EAPConstants;->EAP_POTP:I
-Landroid/net/wifi/EAPConstants;->EAP_PSK:I
-Landroid/net/wifi/EAPConstants;->EAP_PWD:I
-Landroid/net/wifi/EAPConstants;->EAP_RSA:I
-Landroid/net/wifi/EAPConstants;->EAP_SAKE:I
-Landroid/net/wifi/EAPConstants;->EAP_SIM:I
-Landroid/net/wifi/EAPConstants;->EAP_SPEKE:I
-Landroid/net/wifi/EAPConstants;->EAP_TEAP:I
-Landroid/net/wifi/EAPConstants;->EAP_TLS:I
-Landroid/net/wifi/EAPConstants;->EAP_TTLS:I
-Landroid/net/wifi/EAPConstants;->EAP_ZLXEAP:I
-Landroid/net/wifi/hotspot2/ConfigParser$MimeHeader;-><init>()V
-Landroid/net/wifi/hotspot2/ConfigParser$MimeHeader;->boundary:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/ConfigParser$MimeHeader;->contentType:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/ConfigParser$MimeHeader;->encodingType:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/ConfigParser$MimePart;-><init>()V
-Landroid/net/wifi/hotspot2/ConfigParser$MimePart;->data:[B
-Landroid/net/wifi/hotspot2/ConfigParser$MimePart;->isLast:Z
-Landroid/net/wifi/hotspot2/ConfigParser$MimePart;->type:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/ConfigParser;-><init>()V
-Landroid/net/wifi/hotspot2/ConfigParser;->BOUNDARY:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/ConfigParser;->CONTENT_TRANSFER_ENCODING:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/ConfigParser;->CONTENT_TYPE:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/ConfigParser;->createPasspointConfig(Ljava/util/Map;)Landroid/net/wifi/hotspot2/PasspointConfiguration;
-Landroid/net/wifi/hotspot2/ConfigParser;->ENCODING_BASE64:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/ConfigParser;->parseCACert([B)Ljava/security/cert/X509Certificate;
-Landroid/net/wifi/hotspot2/ConfigParser;->parseContentType(Ljava/lang/String;)Landroid/util/Pair;
-Landroid/net/wifi/hotspot2/ConfigParser;->parseHeaders(Ljava/io/LineNumberReader;)Landroid/net/wifi/hotspot2/ConfigParser$MimeHeader;
-Landroid/net/wifi/hotspot2/ConfigParser;->parseMimeMultipartMessage(Ljava/io/LineNumberReader;)Ljava/util/Map;
-Landroid/net/wifi/hotspot2/ConfigParser;->parseMimePart(Ljava/io/LineNumberReader;Ljava/lang/String;)Landroid/net/wifi/hotspot2/ConfigParser$MimePart;
-Landroid/net/wifi/hotspot2/ConfigParser;->parsePkcs12([B)Landroid/util/Pair;
-Landroid/net/wifi/hotspot2/ConfigParser;->readHeaders(Ljava/io/LineNumberReader;)Ljava/util/Map;
-Landroid/net/wifi/hotspot2/ConfigParser;->TAG:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/ConfigParser;->TYPE_CA_CERT:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/ConfigParser;->TYPE_MULTIPART_MIXED:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/ConfigParser;->TYPE_PASSPOINT_PROFILE:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/ConfigParser;->TYPE_PKCS12:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/ConfigParser;->TYPE_WIFI_CONFIG:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/IProvisioningCallback$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/net/wifi/hotspot2/IProvisioningCallback$Stub$Proxy;->getInterfaceDescriptor()Ljava/lang/String;
-Landroid/net/wifi/hotspot2/IProvisioningCallback$Stub$Proxy;->mRemote:Landroid/os/IBinder;
-Landroid/net/wifi/hotspot2/IProvisioningCallback$Stub$Proxy;->onProvisioningFailure(I)V
-Landroid/net/wifi/hotspot2/IProvisioningCallback$Stub$Proxy;->onProvisioningStatus(I)V
-Landroid/net/wifi/hotspot2/IProvisioningCallback$Stub;-><init>()V
-Landroid/net/wifi/hotspot2/IProvisioningCallback$Stub;->asInterface(Landroid/os/IBinder;)Landroid/net/wifi/hotspot2/IProvisioningCallback;
-Landroid/net/wifi/hotspot2/IProvisioningCallback$Stub;->DESCRIPTOR:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/IProvisioningCallback$Stub;->TRANSACTION_onProvisioningFailure:I
-Landroid/net/wifi/hotspot2/IProvisioningCallback$Stub;->TRANSACTION_onProvisioningStatus:I
-Landroid/net/wifi/hotspot2/IProvisioningCallback;->onProvisioningFailure(I)V
-Landroid/net/wifi/hotspot2/IProvisioningCallback;->onProvisioningStatus(I)V
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser$InternalNode;-><init>(Ljava/lang/String;Ljava/util/List;)V
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser$InternalNode;->getChildren()Ljava/util/List;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser$InternalNode;->getValue()Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser$InternalNode;->isLeaf()Z
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser$InternalNode;->mChildren:Ljava/util/List;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser$LeafNode;-><init>(Ljava/lang/String;Ljava/lang/String;)V
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser$LeafNode;->getChildren()Ljava/util/List;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser$LeafNode;->getValue()Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser$LeafNode;->isLeaf()Z
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser$LeafNode;->mValue:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser$ParsingException;-><init>(Ljava/lang/String;)V
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser$PPSNode;-><init>(Ljava/lang/String;)V
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser$PPSNode;->getChildren()Ljava/util/List;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser$PPSNode;->getName()Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser$PPSNode;->getValue()Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser$PPSNode;->isLeaf()Z
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser$PPSNode;->mName:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;-><init>()V
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->buildPpsNode(Landroid/net/wifi/hotspot2/omadm/XMLNode;)Landroid/net/wifi/hotspot2/omadm/PpsMoParser$PPSNode;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->convertFromLongList(Ljava/util/List;)[J
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->getPpsNodeValue(Landroid/net/wifi/hotspot2/omadm/PpsMoParser$PPSNode;)Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_AAA_SERVER_TRUST_ROOT:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_ABLE_TO_SHARE:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_CERTIFICATE_TYPE:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_CERT_SHA256_FINGERPRINT:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_CERT_URL:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_CHECK_AAA_SERVER_CERT_STATUS:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_COUNTRY:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_CREATION_DATE:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_CREDENTIAL:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_CREDENTIAL_PRIORITY:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_DATA_LIMIT:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_DIGITAL_CERTIFICATE:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_DOWNLINK_BANDWIDTH:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_EAP_METHOD:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_EAP_TYPE:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_EXPIRATION_DATE:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_EXTENSION:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_FQDN:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_FQDN_MATCH:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_FRIENDLY_NAME:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_HESSID:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_HOMESP:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_HOME_OI:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_HOME_OI_LIST:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_HOME_OI_REQUIRED:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_ICON_URL:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_INNER_EAP_TYPE:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_INNER_METHOD:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_INNER_VENDOR_ID:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_INNER_VENDOR_TYPE:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_IP_PROTOCOL:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_MACHINE_MANAGED:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_MAXIMUM_BSS_LOAD_VALUE:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_MIN_BACKHAUL_THRESHOLD:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_NETWORK_ID:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_NETWORK_TYPE:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_OTHER:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_OTHER_HOME_PARTNERS:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_PASSWORD:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_PER_PROVIDER_SUBSCRIPTION:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_POLICY:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_POLICY_UPDATE:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_PORT_NUMBER:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_PREFERRED_ROAMING_PARTNER_LIST:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_PRIORITY:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_REALM:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_REQUIRED_PROTO_PORT_TUPLE:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_RESTRICTION:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_ROAMING_CONSORTIUM_OI:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_SIM:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_SIM_IMSI:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_SOFT_TOKEN_APP:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_SP_EXCLUSION_LIST:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_SSID:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_START_DATE:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_SUBSCRIPTION_PARAMETER:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_SUBSCRIPTION_UPDATE:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_TIME_LIMIT:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_TRUST_ROOT:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_TYPE_OF_SUBSCRIPTION:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_UPDATE_IDENTIFIER:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_UPDATE_INTERVAL:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_UPDATE_METHOD:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_UPLINK_BANDWIDTH:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_URI:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_USAGE_LIMITS:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_USAGE_TIME_PERIOD:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_USERNAME:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_USERNAME_PASSWORD:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_VENDOR_ID:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_VENDOR_TYPE:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->parseAAAServerTrustRootList(Landroid/net/wifi/hotspot2/omadm/PpsMoParser$PPSNode;)Ljava/util/Map;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->parseCertificateCredential(Landroid/net/wifi/hotspot2/omadm/PpsMoParser$PPSNode;)Landroid/net/wifi/hotspot2/pps/Credential$CertificateCredential;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->parseCredential(Landroid/net/wifi/hotspot2/omadm/PpsMoParser$PPSNode;)Landroid/net/wifi/hotspot2/pps/Credential;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->parseDate(Ljava/lang/String;)J
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->parseEAPMethod(Landroid/net/wifi/hotspot2/omadm/PpsMoParser$PPSNode;Landroid/net/wifi/hotspot2/pps/Credential$UserCredential;)V
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->parseHexString(Ljava/lang/String;)[B
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->parseHomeOIInstance(Landroid/net/wifi/hotspot2/omadm/PpsMoParser$PPSNode;)Landroid/util/Pair;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->parseHomeOIList(Landroid/net/wifi/hotspot2/omadm/PpsMoParser$PPSNode;)Landroid/util/Pair;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->parseHomeSP(Landroid/net/wifi/hotspot2/omadm/PpsMoParser$PPSNode;)Landroid/net/wifi/hotspot2/pps/HomeSp;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->parseInteger(Ljava/lang/String;)I
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->parseLong(Ljava/lang/String;I)J
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->parseMinBackhaulThreshold(Landroid/net/wifi/hotspot2/omadm/PpsMoParser$PPSNode;Landroid/net/wifi/hotspot2/pps/Policy;)V
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->parseMinBackhaulThresholdInstance(Landroid/net/wifi/hotspot2/omadm/PpsMoParser$PPSNode;Landroid/net/wifi/hotspot2/pps/Policy;)V
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->parseNetworkIdInstance(Landroid/net/wifi/hotspot2/omadm/PpsMoParser$PPSNode;)Landroid/util/Pair;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->parseNetworkIds(Landroid/net/wifi/hotspot2/omadm/PpsMoParser$PPSNode;)Ljava/util/Map;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->parseOtherHomePartnerInstance(Landroid/net/wifi/hotspot2/omadm/PpsMoParser$PPSNode;)Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->parseOtherHomePartners(Landroid/net/wifi/hotspot2/omadm/PpsMoParser$PPSNode;)[Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->parsePolicy(Landroid/net/wifi/hotspot2/omadm/PpsMoParser$PPSNode;)Landroid/net/wifi/hotspot2/pps/Policy;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->parsePpsInstance(Landroid/net/wifi/hotspot2/omadm/PpsMoParser$PPSNode;)Landroid/net/wifi/hotspot2/PasspointConfiguration;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->parsePpsNode(Landroid/net/wifi/hotspot2/omadm/XMLNode;)Landroid/net/wifi/hotspot2/PasspointConfiguration;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->parsePreferredRoamingPartner(Landroid/net/wifi/hotspot2/omadm/PpsMoParser$PPSNode;)Landroid/net/wifi/hotspot2/pps/Policy$RoamingPartner;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->parsePreferredRoamingPartnerList(Landroid/net/wifi/hotspot2/omadm/PpsMoParser$PPSNode;)Ljava/util/List;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->parseProtoPortTuple(Landroid/net/wifi/hotspot2/omadm/PpsMoParser$PPSNode;)Landroid/util/Pair;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->parseRequiredProtoPortTuple(Landroid/net/wifi/hotspot2/omadm/PpsMoParser$PPSNode;)Ljava/util/Map;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->parseRoamingConsortiumOI(Ljava/lang/String;)[J
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->parseSimCredential(Landroid/net/wifi/hotspot2/omadm/PpsMoParser$PPSNode;)Landroid/net/wifi/hotspot2/pps/Credential$SimCredential;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->parseSpExclusionInstance(Landroid/net/wifi/hotspot2/omadm/PpsMoParser$PPSNode;)Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->parseSpExclusionList(Landroid/net/wifi/hotspot2/omadm/PpsMoParser$PPSNode;)[Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->parseSubscriptionParameter(Landroid/net/wifi/hotspot2/omadm/PpsMoParser$PPSNode;Landroid/net/wifi/hotspot2/PasspointConfiguration;)V
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->parseTrustRoot(Landroid/net/wifi/hotspot2/omadm/PpsMoParser$PPSNode;)Landroid/util/Pair;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->parseUpdateParameter(Landroid/net/wifi/hotspot2/omadm/PpsMoParser$PPSNode;)Landroid/net/wifi/hotspot2/pps/UpdateParameter;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->parseUpdateUserCredential(Landroid/net/wifi/hotspot2/omadm/PpsMoParser$PPSNode;)Landroid/util/Pair;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->parseUrn(Landroid/net/wifi/hotspot2/omadm/XMLNode;)Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->parseUsageLimits(Landroid/net/wifi/hotspot2/omadm/PpsMoParser$PPSNode;Landroid/net/wifi/hotspot2/PasspointConfiguration;)V
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->parseUserCredential(Landroid/net/wifi/hotspot2/omadm/PpsMoParser$PPSNode;)Landroid/net/wifi/hotspot2/pps/Credential$UserCredential;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->PPS_MO_URN:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->TAG:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->TAG_DDF_NAME:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->TAG_MANAGEMENT_TREE:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->TAG_NODE:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->TAG_NODE_NAME:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->TAG_RT_PROPERTIES:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->TAG_TYPE:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->TAG_VALUE:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->TAG_VER_DTD:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/XMLNode;-><init>(Landroid/net/wifi/hotspot2/omadm/XMLNode;Ljava/lang/String;)V
-Landroid/net/wifi/hotspot2/omadm/XMLNode;->addChild(Landroid/net/wifi/hotspot2/omadm/XMLNode;)V
-Landroid/net/wifi/hotspot2/omadm/XMLNode;->addText(Ljava/lang/String;)V
-Landroid/net/wifi/hotspot2/omadm/XMLNode;->close()V
-Landroid/net/wifi/hotspot2/omadm/XMLNode;->getChildren()Ljava/util/List;
-Landroid/net/wifi/hotspot2/omadm/XMLNode;->getParent()Landroid/net/wifi/hotspot2/omadm/XMLNode;
-Landroid/net/wifi/hotspot2/omadm/XMLNode;->getTag()Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/XMLNode;->getText()Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/XMLNode;->mChildren:Ljava/util/List;
-Landroid/net/wifi/hotspot2/omadm/XMLNode;->mParent:Landroid/net/wifi/hotspot2/omadm/XMLNode;
-Landroid/net/wifi/hotspot2/omadm/XMLNode;->mTag:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/XMLNode;->mText:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/XMLNode;->mTextBuilder:Ljava/lang/StringBuilder;
-Landroid/net/wifi/hotspot2/omadm/XMLParser;-><init>()V
-Landroid/net/wifi/hotspot2/omadm/XMLParser;->mCurrent:Landroid/net/wifi/hotspot2/omadm/XMLNode;
-Landroid/net/wifi/hotspot2/omadm/XMLParser;->mRoot:Landroid/net/wifi/hotspot2/omadm/XMLNode;
-Landroid/net/wifi/hotspot2/omadm/XMLParser;->parse(Ljava/lang/String;)Landroid/net/wifi/hotspot2/omadm/XMLNode;
-Landroid/net/wifi/hotspot2/OsuProvider;-><init>(Landroid/net/wifi/hotspot2/OsuProvider;)V
-Landroid/net/wifi/hotspot2/OsuProvider;-><init>(Landroid/net/wifi/WifiSsid;Ljava/lang/String;Ljava/lang/String;Landroid/net/Uri;Ljava/lang/String;Ljava/util/List;Landroid/graphics/drawable/Icon;)V
-Landroid/net/wifi/hotspot2/OsuProvider;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/net/wifi/hotspot2/OsuProvider;->getFriendlyName()Ljava/lang/String;
-Landroid/net/wifi/hotspot2/OsuProvider;->getIcon()Landroid/graphics/drawable/Icon;
-Landroid/net/wifi/hotspot2/OsuProvider;->getMethodList()Ljava/util/List;
-Landroid/net/wifi/hotspot2/OsuProvider;->getNetworkAccessIdentifier()Ljava/lang/String;
-Landroid/net/wifi/hotspot2/OsuProvider;->getOsuSsid()Landroid/net/wifi/WifiSsid;
-Landroid/net/wifi/hotspot2/OsuProvider;->getServerUri()Landroid/net/Uri;
-Landroid/net/wifi/hotspot2/OsuProvider;->getServiceDescription()Ljava/lang/String;
-Landroid/net/wifi/hotspot2/OsuProvider;->METHOD_OMA_DM:I
-Landroid/net/wifi/hotspot2/OsuProvider;->METHOD_SOAP_XML_SPP:I
-Landroid/net/wifi/hotspot2/OsuProvider;->mFriendlyName:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/OsuProvider;->mIcon:Landroid/graphics/drawable/Icon;
-Landroid/net/wifi/hotspot2/OsuProvider;->mMethodList:Ljava/util/List;
-Landroid/net/wifi/hotspot2/OsuProvider;->mNetworkAccessIdentifier:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/OsuProvider;->mOsuSsid:Landroid/net/wifi/WifiSsid;
-Landroid/net/wifi/hotspot2/OsuProvider;->mServerUri:Landroid/net/Uri;
-Landroid/net/wifi/hotspot2/OsuProvider;->mServiceDescription:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/PasspointConfiguration;->CERTIFICATE_SHA256_BYTES:I
-Landroid/net/wifi/hotspot2/PasspointConfiguration;->getCredentialPriority()I
-Landroid/net/wifi/hotspot2/PasspointConfiguration;->getPolicy()Landroid/net/wifi/hotspot2/pps/Policy;
-Landroid/net/wifi/hotspot2/PasspointConfiguration;->getSubscriptionCreationTimeInMillis()J
-Landroid/net/wifi/hotspot2/PasspointConfiguration;->getSubscriptionExpirationTimeInMillis()J
-Landroid/net/wifi/hotspot2/PasspointConfiguration;->getSubscriptionType()Ljava/lang/String;
-Landroid/net/wifi/hotspot2/PasspointConfiguration;->getSubscriptionUpdate()Landroid/net/wifi/hotspot2/pps/UpdateParameter;
-Landroid/net/wifi/hotspot2/PasspointConfiguration;->getTrustRootCertList()Ljava/util/Map;
-Landroid/net/wifi/hotspot2/PasspointConfiguration;->getUpdateIdentifier()I
-Landroid/net/wifi/hotspot2/PasspointConfiguration;->getUsageLimitDataLimit()J
-Landroid/net/wifi/hotspot2/PasspointConfiguration;->getUsageLimitStartTimeInMillis()J
-Landroid/net/wifi/hotspot2/PasspointConfiguration;->getUsageLimitTimeLimitInMinutes()J
-Landroid/net/wifi/hotspot2/PasspointConfiguration;->getUsageLimitUsageTimePeriodInMinutes()J
-Landroid/net/wifi/hotspot2/PasspointConfiguration;->isTrustRootCertListEquals(Ljava/util/Map;Ljava/util/Map;)Z
-Landroid/net/wifi/hotspot2/PasspointConfiguration;->MAX_URL_BYTES:I
-Landroid/net/wifi/hotspot2/PasspointConfiguration;->mCredential:Landroid/net/wifi/hotspot2/pps/Credential;
-Landroid/net/wifi/hotspot2/PasspointConfiguration;->mCredentialPriority:I
-Landroid/net/wifi/hotspot2/PasspointConfiguration;->mHomeSp:Landroid/net/wifi/hotspot2/pps/HomeSp;
-Landroid/net/wifi/hotspot2/PasspointConfiguration;->mPolicy:Landroid/net/wifi/hotspot2/pps/Policy;
-Landroid/net/wifi/hotspot2/PasspointConfiguration;->mSubscriptionCreationTimeInMillis:J
-Landroid/net/wifi/hotspot2/PasspointConfiguration;->mSubscriptionExpirationTimeInMillis:J
-Landroid/net/wifi/hotspot2/PasspointConfiguration;->mSubscriptionType:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/PasspointConfiguration;->mSubscriptionUpdate:Landroid/net/wifi/hotspot2/pps/UpdateParameter;
-Landroid/net/wifi/hotspot2/PasspointConfiguration;->mTrustRootCertList:Ljava/util/Map;
-Landroid/net/wifi/hotspot2/PasspointConfiguration;->mUpdateIdentifier:I
-Landroid/net/wifi/hotspot2/PasspointConfiguration;->mUsageLimitDataLimit:J
-Landroid/net/wifi/hotspot2/PasspointConfiguration;->mUsageLimitStartTimeInMillis:J
-Landroid/net/wifi/hotspot2/PasspointConfiguration;->mUsageLimitTimeLimitInMinutes:J
-Landroid/net/wifi/hotspot2/PasspointConfiguration;->mUsageLimitUsageTimePeriodInMinutes:J
-Landroid/net/wifi/hotspot2/PasspointConfiguration;->NULL_VALUE:I
-Landroid/net/wifi/hotspot2/PasspointConfiguration;->setCredentialPriority(I)V
-Landroid/net/wifi/hotspot2/PasspointConfiguration;->setPolicy(Landroid/net/wifi/hotspot2/pps/Policy;)V
-Landroid/net/wifi/hotspot2/PasspointConfiguration;->setSubscriptionCreationTimeInMillis(J)V
-Landroid/net/wifi/hotspot2/PasspointConfiguration;->setSubscriptionExpirationTimeInMillis(J)V
-Landroid/net/wifi/hotspot2/PasspointConfiguration;->setSubscriptionType(Ljava/lang/String;)V
-Landroid/net/wifi/hotspot2/PasspointConfiguration;->setSubscriptionUpdate(Landroid/net/wifi/hotspot2/pps/UpdateParameter;)V
-Landroid/net/wifi/hotspot2/PasspointConfiguration;->setTrustRootCertList(Ljava/util/Map;)V
-Landroid/net/wifi/hotspot2/PasspointConfiguration;->setUpdateIdentifier(I)V
-Landroid/net/wifi/hotspot2/PasspointConfiguration;->setUsageLimitDataLimit(J)V
-Landroid/net/wifi/hotspot2/PasspointConfiguration;->setUsageLimitStartTimeInMillis(J)V
-Landroid/net/wifi/hotspot2/PasspointConfiguration;->setUsageLimitTimeLimitInMinutes(J)V
-Landroid/net/wifi/hotspot2/PasspointConfiguration;->setUsageLimitUsageTimePeriodInMinutes(J)V
-Landroid/net/wifi/hotspot2/PasspointConfiguration;->TAG:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/PasspointConfiguration;->validate()Z
-Landroid/net/wifi/hotspot2/PasspointConfiguration;->writeTrustRootCerts(Landroid/os/Parcel;Ljava/util/Map;)V
-Landroid/net/wifi/hotspot2/pps/Credential$CertificateCredential;->CERT_SHA256_FINGER_PRINT_LENGTH:I
-Landroid/net/wifi/hotspot2/pps/Credential$CertificateCredential;->CERT_TYPE_X509V3:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/pps/Credential$CertificateCredential;->mCertSha256Fingerprint:[B
-Landroid/net/wifi/hotspot2/pps/Credential$CertificateCredential;->mCertType:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/pps/Credential$CertificateCredential;->validate()Z
-Landroid/net/wifi/hotspot2/pps/Credential$SimCredential;->MAX_IMSI_LENGTH:I
-Landroid/net/wifi/hotspot2/pps/Credential$SimCredential;->mEapType:I
-Landroid/net/wifi/hotspot2/pps/Credential$SimCredential;->mImsi:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/pps/Credential$SimCredential;->validate()Z
-Landroid/net/wifi/hotspot2/pps/Credential$SimCredential;->verifyImsi()Z
-Landroid/net/wifi/hotspot2/pps/Credential$UserCredential;->AUTH_METHOD_MSCHAP:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/pps/Credential$UserCredential;->AUTH_METHOD_MSCHAPV2:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/pps/Credential$UserCredential;->AUTH_METHOD_PAP:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/pps/Credential$UserCredential;->getAbleToShare()Z
-Landroid/net/wifi/hotspot2/pps/Credential$UserCredential;->getMachineManaged()Z
-Landroid/net/wifi/hotspot2/pps/Credential$UserCredential;->getSoftTokenApp()Ljava/lang/String;
-Landroid/net/wifi/hotspot2/pps/Credential$UserCredential;->mAbleToShare:Z
-Landroid/net/wifi/hotspot2/pps/Credential$UserCredential;->MAX_PASSWORD_BYTES:I
-Landroid/net/wifi/hotspot2/pps/Credential$UserCredential;->MAX_USERNAME_BYTES:I
-Landroid/net/wifi/hotspot2/pps/Credential$UserCredential;->mEapType:I
-Landroid/net/wifi/hotspot2/pps/Credential$UserCredential;->mMachineManaged:Z
-Landroid/net/wifi/hotspot2/pps/Credential$UserCredential;->mNonEapInnerMethod:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/pps/Credential$UserCredential;->mPassword:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/pps/Credential$UserCredential;->mSoftTokenApp:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/pps/Credential$UserCredential;->mUsername:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/pps/Credential$UserCredential;->setAbleToShare(Z)V
-Landroid/net/wifi/hotspot2/pps/Credential$UserCredential;->setMachineManaged(Z)V
-Landroid/net/wifi/hotspot2/pps/Credential$UserCredential;->setSoftTokenApp(Ljava/lang/String;)V
-Landroid/net/wifi/hotspot2/pps/Credential$UserCredential;->SUPPORTED_AUTH:Ljava/util/Set;
-Landroid/net/wifi/hotspot2/pps/Credential$UserCredential;->validate()Z
-Landroid/net/wifi/hotspot2/pps/Credential;->getCheckAaaServerCertStatus()Z
-Landroid/net/wifi/hotspot2/pps/Credential;->getCreationTimeInMillis()J
-Landroid/net/wifi/hotspot2/pps/Credential;->getExpirationTimeInMillis()J
-Landroid/net/wifi/hotspot2/pps/Credential;->isPrivateKeyEquals(Ljava/security/PrivateKey;Ljava/security/PrivateKey;)Z
-Landroid/net/wifi/hotspot2/pps/Credential;->isX509CertificateEquals(Ljava/security/cert/X509Certificate;Ljava/security/cert/X509Certificate;)Z
-Landroid/net/wifi/hotspot2/pps/Credential;->isX509CertificatesEquals([Ljava/security/cert/X509Certificate;[Ljava/security/cert/X509Certificate;)Z
-Landroid/net/wifi/hotspot2/pps/Credential;->MAX_REALM_BYTES:I
-Landroid/net/wifi/hotspot2/pps/Credential;->mCaCertificate:Ljava/security/cert/X509Certificate;
-Landroid/net/wifi/hotspot2/pps/Credential;->mCertCredential:Landroid/net/wifi/hotspot2/pps/Credential$CertificateCredential;
-Landroid/net/wifi/hotspot2/pps/Credential;->mCheckAaaServerCertStatus:Z
-Landroid/net/wifi/hotspot2/pps/Credential;->mClientCertificateChain:[Ljava/security/cert/X509Certificate;
-Landroid/net/wifi/hotspot2/pps/Credential;->mClientPrivateKey:Ljava/security/PrivateKey;
-Landroid/net/wifi/hotspot2/pps/Credential;->mCreationTimeInMillis:J
-Landroid/net/wifi/hotspot2/pps/Credential;->mExpirationTimeInMillis:J
-Landroid/net/wifi/hotspot2/pps/Credential;->mRealm:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/pps/Credential;->mSimCredential:Landroid/net/wifi/hotspot2/pps/Credential$SimCredential;
-Landroid/net/wifi/hotspot2/pps/Credential;->mUserCredential:Landroid/net/wifi/hotspot2/pps/Credential$UserCredential;
-Landroid/net/wifi/hotspot2/pps/Credential;->setCheckAaaServerCertStatus(Z)V
-Landroid/net/wifi/hotspot2/pps/Credential;->setCreationTimeInMillis(J)V
-Landroid/net/wifi/hotspot2/pps/Credential;->setExpirationTimeInMillis(J)V
-Landroid/net/wifi/hotspot2/pps/Credential;->TAG:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/pps/Credential;->validate()Z
-Landroid/net/wifi/hotspot2/pps/Credential;->verifyCertCredential()Z
-Landroid/net/wifi/hotspot2/pps/Credential;->verifySha256Fingerprint([Ljava/security/cert/X509Certificate;[B)Z
-Landroid/net/wifi/hotspot2/pps/Credential;->verifySimCredential()Z
-Landroid/net/wifi/hotspot2/pps/Credential;->verifyUserCredential()Z
-Landroid/net/wifi/hotspot2/pps/HomeSp;->getHomeNetworkIds()Ljava/util/Map;
-Landroid/net/wifi/hotspot2/pps/HomeSp;->getIconUrl()Ljava/lang/String;
-Landroid/net/wifi/hotspot2/pps/HomeSp;->getMatchAllOis()[J
-Landroid/net/wifi/hotspot2/pps/HomeSp;->getMatchAnyOis()[J
-Landroid/net/wifi/hotspot2/pps/HomeSp;->getOtherHomePartners()[Ljava/lang/String;
-Landroid/net/wifi/hotspot2/pps/HomeSp;->MAX_SSID_BYTES:I
-Landroid/net/wifi/hotspot2/pps/HomeSp;->mFqdn:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/pps/HomeSp;->mFriendlyName:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/pps/HomeSp;->mHomeNetworkIds:Ljava/util/Map;
-Landroid/net/wifi/hotspot2/pps/HomeSp;->mIconUrl:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/pps/HomeSp;->mMatchAllOis:[J
-Landroid/net/wifi/hotspot2/pps/HomeSp;->mMatchAnyOis:[J
-Landroid/net/wifi/hotspot2/pps/HomeSp;->mOtherHomePartners:[Ljava/lang/String;
-Landroid/net/wifi/hotspot2/pps/HomeSp;->mRoamingConsortiumOis:[J
-Landroid/net/wifi/hotspot2/pps/HomeSp;->NULL_VALUE:I
-Landroid/net/wifi/hotspot2/pps/HomeSp;->setHomeNetworkIds(Ljava/util/Map;)V
-Landroid/net/wifi/hotspot2/pps/HomeSp;->setIconUrl(Ljava/lang/String;)V
-Landroid/net/wifi/hotspot2/pps/HomeSp;->setMatchAllOis([J)V
-Landroid/net/wifi/hotspot2/pps/HomeSp;->setMatchAnyOis([J)V
-Landroid/net/wifi/hotspot2/pps/HomeSp;->setOtherHomePartners([Ljava/lang/String;)V
-Landroid/net/wifi/hotspot2/pps/HomeSp;->TAG:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/pps/HomeSp;->validate()Z
-Landroid/net/wifi/hotspot2/pps/HomeSp;->writeHomeNetworkIds(Landroid/os/Parcel;Ljava/util/Map;)V
-Landroid/net/wifi/hotspot2/pps/Policy$RoamingPartner;-><init>()V
-Landroid/net/wifi/hotspot2/pps/Policy$RoamingPartner;-><init>(Landroid/net/wifi/hotspot2/pps/Policy$RoamingPartner;)V
-Landroid/net/wifi/hotspot2/pps/Policy$RoamingPartner;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/net/wifi/hotspot2/pps/Policy$RoamingPartner;->getCountries()Ljava/lang/String;
-Landroid/net/wifi/hotspot2/pps/Policy$RoamingPartner;->getFqdn()Ljava/lang/String;
-Landroid/net/wifi/hotspot2/pps/Policy$RoamingPartner;->getFqdnExactMatch()Z
-Landroid/net/wifi/hotspot2/pps/Policy$RoamingPartner;->getPriority()I
-Landroid/net/wifi/hotspot2/pps/Policy$RoamingPartner;->mCountries:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/pps/Policy$RoamingPartner;->mFqdn:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/pps/Policy$RoamingPartner;->mFqdnExactMatch:Z
-Landroid/net/wifi/hotspot2/pps/Policy$RoamingPartner;->mPriority:I
-Landroid/net/wifi/hotspot2/pps/Policy$RoamingPartner;->setCountries(Ljava/lang/String;)V
-Landroid/net/wifi/hotspot2/pps/Policy$RoamingPartner;->setFqdn(Ljava/lang/String;)V
-Landroid/net/wifi/hotspot2/pps/Policy$RoamingPartner;->setFqdnExactMatch(Z)V
-Landroid/net/wifi/hotspot2/pps/Policy$RoamingPartner;->setPriority(I)V
-Landroid/net/wifi/hotspot2/pps/Policy$RoamingPartner;->validate()Z
-Landroid/net/wifi/hotspot2/pps/Policy;-><init>()V
-Landroid/net/wifi/hotspot2/pps/Policy;-><init>(Landroid/net/wifi/hotspot2/pps/Policy;)V
-Landroid/net/wifi/hotspot2/pps/Policy;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/net/wifi/hotspot2/pps/Policy;->getExcludedSsidList()[Ljava/lang/String;
-Landroid/net/wifi/hotspot2/pps/Policy;->getMaximumBssLoadValue()I
-Landroid/net/wifi/hotspot2/pps/Policy;->getMinHomeDownlinkBandwidth()J
-Landroid/net/wifi/hotspot2/pps/Policy;->getMinHomeUplinkBandwidth()J
-Landroid/net/wifi/hotspot2/pps/Policy;->getMinRoamingDownlinkBandwidth()J
-Landroid/net/wifi/hotspot2/pps/Policy;->getMinRoamingUplinkBandwidth()J
-Landroid/net/wifi/hotspot2/pps/Policy;->getPolicyUpdate()Landroid/net/wifi/hotspot2/pps/UpdateParameter;
-Landroid/net/wifi/hotspot2/pps/Policy;->getPreferredRoamingPartnerList()Ljava/util/List;
-Landroid/net/wifi/hotspot2/pps/Policy;->getRequiredProtoPortMap()Ljava/util/Map;
-Landroid/net/wifi/hotspot2/pps/Policy;->MAX_EXCLUSION_SSIDS:I
-Landroid/net/wifi/hotspot2/pps/Policy;->MAX_PORT_STRING_BYTES:I
-Landroid/net/wifi/hotspot2/pps/Policy;->MAX_SSID_BYTES:I
-Landroid/net/wifi/hotspot2/pps/Policy;->mExcludedSsidList:[Ljava/lang/String;
-Landroid/net/wifi/hotspot2/pps/Policy;->mMaximumBssLoadValue:I
-Landroid/net/wifi/hotspot2/pps/Policy;->mMinHomeDownlinkBandwidth:J
-Landroid/net/wifi/hotspot2/pps/Policy;->mMinHomeUplinkBandwidth:J
-Landroid/net/wifi/hotspot2/pps/Policy;->mMinRoamingDownlinkBandwidth:J
-Landroid/net/wifi/hotspot2/pps/Policy;->mMinRoamingUplinkBandwidth:J
-Landroid/net/wifi/hotspot2/pps/Policy;->mPolicyUpdate:Landroid/net/wifi/hotspot2/pps/UpdateParameter;
-Landroid/net/wifi/hotspot2/pps/Policy;->mPreferredRoamingPartnerList:Ljava/util/List;
-Landroid/net/wifi/hotspot2/pps/Policy;->mRequiredProtoPortMap:Ljava/util/Map;
-Landroid/net/wifi/hotspot2/pps/Policy;->NULL_VALUE:I
-Landroid/net/wifi/hotspot2/pps/Policy;->setExcludedSsidList([Ljava/lang/String;)V
-Landroid/net/wifi/hotspot2/pps/Policy;->setMaximumBssLoadValue(I)V
-Landroid/net/wifi/hotspot2/pps/Policy;->setMinHomeDownlinkBandwidth(J)V
-Landroid/net/wifi/hotspot2/pps/Policy;->setMinHomeUplinkBandwidth(J)V
-Landroid/net/wifi/hotspot2/pps/Policy;->setMinRoamingDownlinkBandwidth(J)V
-Landroid/net/wifi/hotspot2/pps/Policy;->setMinRoamingUplinkBandwidth(J)V
-Landroid/net/wifi/hotspot2/pps/Policy;->setPolicyUpdate(Landroid/net/wifi/hotspot2/pps/UpdateParameter;)V
-Landroid/net/wifi/hotspot2/pps/Policy;->setPreferredRoamingPartnerList(Ljava/util/List;)V
-Landroid/net/wifi/hotspot2/pps/Policy;->setRequiredProtoPortMap(Ljava/util/Map;)V
-Landroid/net/wifi/hotspot2/pps/Policy;->TAG:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/pps/Policy;->validate()Z
-Landroid/net/wifi/hotspot2/pps/Policy;->writeProtoPortMap(Landroid/os/Parcel;Ljava/util/Map;)V
-Landroid/net/wifi/hotspot2/pps/Policy;->writeRoamingPartnerList(Landroid/os/Parcel;ILjava/util/List;)V
-Landroid/net/wifi/hotspot2/pps/UpdateParameter;-><init>()V
-Landroid/net/wifi/hotspot2/pps/UpdateParameter;-><init>(Landroid/net/wifi/hotspot2/pps/UpdateParameter;)V
-Landroid/net/wifi/hotspot2/pps/UpdateParameter;->CERTIFICATE_SHA256_BYTES:I
-Landroid/net/wifi/hotspot2/pps/UpdateParameter;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/net/wifi/hotspot2/pps/UpdateParameter;->getBase64EncodedPassword()Ljava/lang/String;
-Landroid/net/wifi/hotspot2/pps/UpdateParameter;->getRestriction()Ljava/lang/String;
-Landroid/net/wifi/hotspot2/pps/UpdateParameter;->getServerUri()Ljava/lang/String;
-Landroid/net/wifi/hotspot2/pps/UpdateParameter;->getTrustRootCertSha256Fingerprint()[B
-Landroid/net/wifi/hotspot2/pps/UpdateParameter;->getTrustRootCertUrl()Ljava/lang/String;
-Landroid/net/wifi/hotspot2/pps/UpdateParameter;->getUpdateIntervalInMinutes()J
-Landroid/net/wifi/hotspot2/pps/UpdateParameter;->getUpdateMethod()Ljava/lang/String;
-Landroid/net/wifi/hotspot2/pps/UpdateParameter;->getUsername()Ljava/lang/String;
-Landroid/net/wifi/hotspot2/pps/UpdateParameter;->MAX_PASSWORD_BYTES:I
-Landroid/net/wifi/hotspot2/pps/UpdateParameter;->MAX_URI_BYTES:I
-Landroid/net/wifi/hotspot2/pps/UpdateParameter;->MAX_URL_BYTES:I
-Landroid/net/wifi/hotspot2/pps/UpdateParameter;->MAX_USERNAME_BYTES:I
-Landroid/net/wifi/hotspot2/pps/UpdateParameter;->mBase64EncodedPassword:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/pps/UpdateParameter;->mRestriction:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/pps/UpdateParameter;->mServerUri:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/pps/UpdateParameter;->mTrustRootCertSha256Fingerprint:[B
-Landroid/net/wifi/hotspot2/pps/UpdateParameter;->mTrustRootCertUrl:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/pps/UpdateParameter;->mUpdateIntervalInMinutes:J
-Landroid/net/wifi/hotspot2/pps/UpdateParameter;->mUpdateMethod:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/pps/UpdateParameter;->mUsername:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/pps/UpdateParameter;->setBase64EncodedPassword(Ljava/lang/String;)V
-Landroid/net/wifi/hotspot2/pps/UpdateParameter;->setRestriction(Ljava/lang/String;)V
-Landroid/net/wifi/hotspot2/pps/UpdateParameter;->setServerUri(Ljava/lang/String;)V
-Landroid/net/wifi/hotspot2/pps/UpdateParameter;->setTrustRootCertSha256Fingerprint([B)V
-Landroid/net/wifi/hotspot2/pps/UpdateParameter;->setTrustRootCertUrl(Ljava/lang/String;)V
-Landroid/net/wifi/hotspot2/pps/UpdateParameter;->setUpdateIntervalInMinutes(J)V
-Landroid/net/wifi/hotspot2/pps/UpdateParameter;->setUpdateMethod(Ljava/lang/String;)V
-Landroid/net/wifi/hotspot2/pps/UpdateParameter;->setUsername(Ljava/lang/String;)V
-Landroid/net/wifi/hotspot2/pps/UpdateParameter;->TAG:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/pps/UpdateParameter;->UPDATE_CHECK_INTERVAL_NEVER:J
-Landroid/net/wifi/hotspot2/pps/UpdateParameter;->UPDATE_METHOD_OMADM:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/pps/UpdateParameter;->UPDATE_METHOD_SSP:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/pps/UpdateParameter;->UPDATE_RESTRICTION_HOMESP:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/pps/UpdateParameter;->UPDATE_RESTRICTION_ROAMING_PARTNER:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/pps/UpdateParameter;->UPDATE_RESTRICTION_UNRESTRICTED:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/pps/UpdateParameter;->validate()Z
Landroid/net/wifi/hotspot2/ProvisioningCallback;-><init>()V
Landroid/net/wifi/hotspot2/ProvisioningCallback;->onProvisioningFailure(I)V
Landroid/net/wifi/hotspot2/ProvisioningCallback;->onProvisioningStatus(I)V
@@ -39099,539 +37040,6 @@
Landroid/net/wifi/hotspot2/ProvisioningCallback;->OSU_STATUS_PROVIDER_VERIFIED:I
Landroid/net/wifi/hotspot2/ProvisioningCallback;->OSU_STATUS_SERVER_CONNECTED:I
Landroid/net/wifi/hotspot2/ProvisioningCallback;->OSU_STATUS_SERVER_VALIDATED:I
-Landroid/net/wifi/ISoftApCallback$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/net/wifi/ISoftApCallback$Stub$Proxy;->getInterfaceDescriptor()Ljava/lang/String;
-Landroid/net/wifi/ISoftApCallback$Stub$Proxy;->mRemote:Landroid/os/IBinder;
-Landroid/net/wifi/ISoftApCallback$Stub$Proxy;->onNumClientsChanged(I)V
-Landroid/net/wifi/ISoftApCallback$Stub$Proxy;->onStateChanged(II)V
-Landroid/net/wifi/ISoftApCallback$Stub;-><init>()V
-Landroid/net/wifi/ISoftApCallback$Stub;->asInterface(Landroid/os/IBinder;)Landroid/net/wifi/ISoftApCallback;
-Landroid/net/wifi/ISoftApCallback$Stub;->DESCRIPTOR:Ljava/lang/String;
-Landroid/net/wifi/ISoftApCallback$Stub;->TRANSACTION_onNumClientsChanged:I
-Landroid/net/wifi/ISoftApCallback$Stub;->TRANSACTION_onStateChanged:I
-Landroid/net/wifi/ISoftApCallback;->onNumClientsChanged(I)V
-Landroid/net/wifi/ISoftApCallback;->onStateChanged(II)V
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->acquireMulticastLock(Landroid/os/IBinder;Ljava/lang/String;)V
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->acquireWifiLock(Landroid/os/IBinder;ILjava/lang/String;Landroid/os/WorkSource;)Z
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->addOrUpdateNetwork(Landroid/net/wifi/WifiConfiguration;Ljava/lang/String;)I
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->addOrUpdatePasspointConfiguration(Landroid/net/wifi/hotspot2/PasspointConfiguration;Ljava/lang/String;)Z
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->deauthenticateNetwork(JZ)V
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->disableEphemeralNetwork(Ljava/lang/String;Ljava/lang/String;)V
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->disableNetwork(ILjava/lang/String;)Z
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->disconnect(Ljava/lang/String;)V
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->enableNetwork(IZLjava/lang/String;)Z
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->enableTdls(Ljava/lang/String;Z)V
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->enableTdlsWithMacAddress(Ljava/lang/String;Z)V
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->enableVerboseLogging(I)V
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->enableWifiConnectivityManager(Z)V
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->factoryReset(Ljava/lang/String;)V
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->getAllMatchingWifiConfigs(Landroid/net/wifi/ScanResult;)Ljava/util/List;
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->getConfiguredNetworks()Landroid/content/pm/ParceledListSlice;
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->getConnectionInfo(Ljava/lang/String;)Landroid/net/wifi/WifiInfo;
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->getCountryCode()Ljava/lang/String;
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->getCurrentNetwork()Landroid/net/Network;
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->getCurrentNetworkWpsNfcConfigurationToken()Ljava/lang/String;
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->getDhcpInfo()Landroid/net/DhcpInfo;
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->getInterfaceDescriptor()Ljava/lang/String;
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->getMatchingOsuProviders(Landroid/net/wifi/ScanResult;)Ljava/util/List;
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->getMatchingWifiConfig(Landroid/net/wifi/ScanResult;)Landroid/net/wifi/WifiConfiguration;
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->getPasspointConfigurations()Ljava/util/List;
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->getPrivilegedConfiguredNetworks()Landroid/content/pm/ParceledListSlice;
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->getScanResults(Ljava/lang/String;)Ljava/util/List;
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->getSupportedFeatures()I
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->getVerboseLoggingLevel()I
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->getWifiApConfiguration()Landroid/net/wifi/WifiConfiguration;
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->getWifiApEnabledState()I
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->getWifiEnabledState()I
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->getWifiServiceMessenger(Ljava/lang/String;)Landroid/os/Messenger;
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->initializeMulticastFiltering()V
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->isDualBandSupported()Z
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->isMulticastEnabled()Z
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->isScanAlwaysAvailable()Z
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->matchProviderWithCurrentNetwork(Ljava/lang/String;)I
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->mRemote:Landroid/os/IBinder;
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->needs5GHzToAnyApBandConversion()Z
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->queryPasspointIcon(JLjava/lang/String;)V
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->reassociate(Ljava/lang/String;)V
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->reconnect(Ljava/lang/String;)V
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->registerSoftApCallback(Landroid/os/IBinder;Landroid/net/wifi/ISoftApCallback;I)V
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->releaseMulticastLock()V
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->releaseWifiLock(Landroid/os/IBinder;)Z
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->removeNetwork(ILjava/lang/String;)Z
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->removePasspointConfiguration(Ljava/lang/String;Ljava/lang/String;)Z
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->reportActivityInfo()Landroid/net/wifi/WifiActivityEnergyInfo;
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->requestActivityInfo(Landroid/os/ResultReceiver;)V
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->restoreBackupData([B)V
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->restoreSupplicantBackupData([B[B)V
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->retrieveBackupData()[B
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->setCountryCode(Ljava/lang/String;)V
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->setWifiApConfiguration(Landroid/net/wifi/WifiConfiguration;Ljava/lang/String;)Z
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->setWifiEnabled(Ljava/lang/String;Z)Z
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->startLocalOnlyHotspot(Landroid/os/Messenger;Landroid/os/IBinder;Ljava/lang/String;)I
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->startScan(Ljava/lang/String;)Z
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->startSoftAp(Landroid/net/wifi/WifiConfiguration;)Z
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->startSubscriptionProvisioning(Landroid/net/wifi/hotspot2/OsuProvider;Landroid/net/wifi/hotspot2/IProvisioningCallback;)V
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->startWatchLocalOnlyHotspot(Landroid/os/Messenger;Landroid/os/IBinder;)V
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->stopLocalOnlyHotspot()V
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->stopSoftAp()Z
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->stopWatchLocalOnlyHotspot()V
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->unregisterSoftApCallback(I)V
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->updateInterfaceIpState(Ljava/lang/String;I)V
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->updateWifiLockWorkSource(Landroid/os/IBinder;Landroid/os/WorkSource;)V
-Landroid/net/wifi/IWifiManager$Stub;->DESCRIPTOR:Ljava/lang/String;
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_acquireMulticastLock:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_acquireWifiLock:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_addOrUpdateNetwork:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_addOrUpdatePasspointConfiguration:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_deauthenticateNetwork:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_disableEphemeralNetwork:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_disableNetwork:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_disconnect:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_enableNetwork:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_enableTdls:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_enableTdlsWithMacAddress:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_enableVerboseLogging:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_enableWifiConnectivityManager:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_factoryReset:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_getAllMatchingWifiConfigs:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_getConfiguredNetworks:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_getConnectionInfo:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_getCountryCode:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_getCurrentNetwork:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_getCurrentNetworkWpsNfcConfigurationToken:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_getDhcpInfo:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_getMatchingOsuProviders:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_getMatchingWifiConfig:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_getPasspointConfigurations:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_getPrivilegedConfiguredNetworks:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_getSupportedFeatures:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_getVerboseLoggingLevel:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_getWifiApConfiguration:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_getWifiApEnabledState:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_getWifiEnabledState:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_getWifiServiceMessenger:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_initializeMulticastFiltering:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_isDualBandSupported:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_isMulticastEnabled:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_isScanAlwaysAvailable:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_matchProviderWithCurrentNetwork:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_needs5GHzToAnyApBandConversion:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_queryPasspointIcon:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_reassociate:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_reconnect:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_registerSoftApCallback:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_releaseMulticastLock:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_releaseWifiLock:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_removeNetwork:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_removePasspointConfiguration:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_reportActivityInfo:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_requestActivityInfo:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_restoreBackupData:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_restoreSupplicantBackupData:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_retrieveBackupData:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_setCountryCode:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_setWifiApConfiguration:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_setWifiEnabled:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_startLocalOnlyHotspot:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_startScan:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_startSoftAp:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_startSubscriptionProvisioning:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_startWatchLocalOnlyHotspot:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_stopLocalOnlyHotspot:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_stopSoftAp:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_stopWatchLocalOnlyHotspot:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_unregisterSoftApCallback:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_updateInterfaceIpState:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_updateWifiLockWorkSource:I
-Landroid/net/wifi/IWifiManager;->acquireMulticastLock(Landroid/os/IBinder;Ljava/lang/String;)V
-Landroid/net/wifi/IWifiManager;->acquireWifiLock(Landroid/os/IBinder;ILjava/lang/String;Landroid/os/WorkSource;)Z
-Landroid/net/wifi/IWifiManager;->addOrUpdateNetwork(Landroid/net/wifi/WifiConfiguration;Ljava/lang/String;)I
-Landroid/net/wifi/IWifiManager;->addOrUpdatePasspointConfiguration(Landroid/net/wifi/hotspot2/PasspointConfiguration;Ljava/lang/String;)Z
-Landroid/net/wifi/IWifiManager;->deauthenticateNetwork(JZ)V
-Landroid/net/wifi/IWifiManager;->disableEphemeralNetwork(Ljava/lang/String;Ljava/lang/String;)V
-Landroid/net/wifi/IWifiManager;->disableNetwork(ILjava/lang/String;)Z
-Landroid/net/wifi/IWifiManager;->disconnect(Ljava/lang/String;)V
-Landroid/net/wifi/IWifiManager;->enableNetwork(IZLjava/lang/String;)Z
-Landroid/net/wifi/IWifiManager;->enableTdls(Ljava/lang/String;Z)V
-Landroid/net/wifi/IWifiManager;->enableTdlsWithMacAddress(Ljava/lang/String;Z)V
-Landroid/net/wifi/IWifiManager;->enableVerboseLogging(I)V
-Landroid/net/wifi/IWifiManager;->enableWifiConnectivityManager(Z)V
-Landroid/net/wifi/IWifiManager;->factoryReset(Ljava/lang/String;)V
-Landroid/net/wifi/IWifiManager;->getAllMatchingWifiConfigs(Landroid/net/wifi/ScanResult;)Ljava/util/List;
-Landroid/net/wifi/IWifiManager;->getConfiguredNetworks()Landroid/content/pm/ParceledListSlice;
-Landroid/net/wifi/IWifiManager;->getConnectionInfo(Ljava/lang/String;)Landroid/net/wifi/WifiInfo;
-Landroid/net/wifi/IWifiManager;->getCountryCode()Ljava/lang/String;
-Landroid/net/wifi/IWifiManager;->getCurrentNetworkWpsNfcConfigurationToken()Ljava/lang/String;
-Landroid/net/wifi/IWifiManager;->getDhcpInfo()Landroid/net/DhcpInfo;
-Landroid/net/wifi/IWifiManager;->getMatchingOsuProviders(Landroid/net/wifi/ScanResult;)Ljava/util/List;
-Landroid/net/wifi/IWifiManager;->getMatchingWifiConfig(Landroid/net/wifi/ScanResult;)Landroid/net/wifi/WifiConfiguration;
-Landroid/net/wifi/IWifiManager;->getPasspointConfigurations()Ljava/util/List;
-Landroid/net/wifi/IWifiManager;->getPrivilegedConfiguredNetworks()Landroid/content/pm/ParceledListSlice;
-Landroid/net/wifi/IWifiManager;->getScanResults(Ljava/lang/String;)Ljava/util/List;
-Landroid/net/wifi/IWifiManager;->getSupportedFeatures()I
-Landroid/net/wifi/IWifiManager;->getVerboseLoggingLevel()I
-Landroid/net/wifi/IWifiManager;->getWifiEnabledState()I
-Landroid/net/wifi/IWifiManager;->getWifiServiceMessenger(Ljava/lang/String;)Landroid/os/Messenger;
-Landroid/net/wifi/IWifiManager;->initializeMulticastFiltering()V
-Landroid/net/wifi/IWifiManager;->isDualBandSupported()Z
-Landroid/net/wifi/IWifiManager;->isMulticastEnabled()Z
-Landroid/net/wifi/IWifiManager;->isScanAlwaysAvailable()Z
-Landroid/net/wifi/IWifiManager;->matchProviderWithCurrentNetwork(Ljava/lang/String;)I
-Landroid/net/wifi/IWifiManager;->needs5GHzToAnyApBandConversion()Z
-Landroid/net/wifi/IWifiManager;->queryPasspointIcon(JLjava/lang/String;)V
-Landroid/net/wifi/IWifiManager;->reassociate(Ljava/lang/String;)V
-Landroid/net/wifi/IWifiManager;->reconnect(Ljava/lang/String;)V
-Landroid/net/wifi/IWifiManager;->registerSoftApCallback(Landroid/os/IBinder;Landroid/net/wifi/ISoftApCallback;I)V
-Landroid/net/wifi/IWifiManager;->releaseMulticastLock()V
-Landroid/net/wifi/IWifiManager;->releaseWifiLock(Landroid/os/IBinder;)Z
-Landroid/net/wifi/IWifiManager;->removeNetwork(ILjava/lang/String;)Z
-Landroid/net/wifi/IWifiManager;->removePasspointConfiguration(Ljava/lang/String;Ljava/lang/String;)Z
-Landroid/net/wifi/IWifiManager;->reportActivityInfo()Landroid/net/wifi/WifiActivityEnergyInfo;
-Landroid/net/wifi/IWifiManager;->requestActivityInfo(Landroid/os/ResultReceiver;)V
-Landroid/net/wifi/IWifiManager;->restoreBackupData([B)V
-Landroid/net/wifi/IWifiManager;->restoreSupplicantBackupData([B[B)V
-Landroid/net/wifi/IWifiManager;->retrieveBackupData()[B
-Landroid/net/wifi/IWifiManager;->setCountryCode(Ljava/lang/String;)V
-Landroid/net/wifi/IWifiManager;->setWifiApConfiguration(Landroid/net/wifi/WifiConfiguration;Ljava/lang/String;)Z
-Landroid/net/wifi/IWifiManager;->setWifiEnabled(Ljava/lang/String;Z)Z
-Landroid/net/wifi/IWifiManager;->startLocalOnlyHotspot(Landroid/os/Messenger;Landroid/os/IBinder;Ljava/lang/String;)I
-Landroid/net/wifi/IWifiManager;->startScan(Ljava/lang/String;)Z
-Landroid/net/wifi/IWifiManager;->startSoftAp(Landroid/net/wifi/WifiConfiguration;)Z
-Landroid/net/wifi/IWifiManager;->startSubscriptionProvisioning(Landroid/net/wifi/hotspot2/OsuProvider;Landroid/net/wifi/hotspot2/IProvisioningCallback;)V
-Landroid/net/wifi/IWifiManager;->startWatchLocalOnlyHotspot(Landroid/os/Messenger;Landroid/os/IBinder;)V
-Landroid/net/wifi/IWifiManager;->stopLocalOnlyHotspot()V
-Landroid/net/wifi/IWifiManager;->stopSoftAp()Z
-Landroid/net/wifi/IWifiManager;->stopWatchLocalOnlyHotspot()V
-Landroid/net/wifi/IWifiManager;->unregisterSoftApCallback(I)V
-Landroid/net/wifi/IWifiManager;->updateInterfaceIpState(Ljava/lang/String;I)V
-Landroid/net/wifi/IWifiManager;->updateWifiLockWorkSource(Landroid/os/IBinder;Landroid/os/WorkSource;)V
-Landroid/net/wifi/IWifiScanner$Stub$Proxy;->getAvailableChannels(I)Landroid/os/Bundle;
-Landroid/net/wifi/IWifiScanner$Stub$Proxy;->getInterfaceDescriptor()Ljava/lang/String;
-Landroid/net/wifi/IWifiScanner$Stub$Proxy;->getMessenger()Landroid/os/Messenger;
-Landroid/net/wifi/IWifiScanner$Stub;->DESCRIPTOR:Ljava/lang/String;
-Landroid/net/wifi/IWifiScanner$Stub;->TRANSACTION_getAvailableChannels:I
-Landroid/net/wifi/IWifiScanner$Stub;->TRANSACTION_getMessenger:I
-Landroid/net/wifi/IWifiScanner;->getAvailableChannels(I)Landroid/os/Bundle;
-Landroid/net/wifi/IWifiScanner;->getMessenger()Landroid/os/Messenger;
-Landroid/net/wifi/p2p/IWifiP2pManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/net/wifi/p2p/IWifiP2pManager$Stub$Proxy;->checkConfigureWifiDisplayPermission()V
-Landroid/net/wifi/p2p/IWifiP2pManager$Stub$Proxy;->close(Landroid/os/IBinder;)V
-Landroid/net/wifi/p2p/IWifiP2pManager$Stub$Proxy;->getInterfaceDescriptor()Ljava/lang/String;
-Landroid/net/wifi/p2p/IWifiP2pManager$Stub$Proxy;->getMessenger(Landroid/os/IBinder;)Landroid/os/Messenger;
-Landroid/net/wifi/p2p/IWifiP2pManager$Stub$Proxy;->getP2pStateMachineMessenger()Landroid/os/Messenger;
-Landroid/net/wifi/p2p/IWifiP2pManager$Stub$Proxy;->mRemote:Landroid/os/IBinder;
-Landroid/net/wifi/p2p/IWifiP2pManager$Stub$Proxy;->setMiracastMode(I)V
-Landroid/net/wifi/p2p/IWifiP2pManager$Stub;-><init>()V
-Landroid/net/wifi/p2p/IWifiP2pManager$Stub;->DESCRIPTOR:Ljava/lang/String;
-Landroid/net/wifi/p2p/IWifiP2pManager$Stub;->TRANSACTION_checkConfigureWifiDisplayPermission:I
-Landroid/net/wifi/p2p/IWifiP2pManager$Stub;->TRANSACTION_close:I
-Landroid/net/wifi/p2p/IWifiP2pManager$Stub;->TRANSACTION_getMessenger:I
-Landroid/net/wifi/p2p/IWifiP2pManager$Stub;->TRANSACTION_getP2pStateMachineMessenger:I
-Landroid/net/wifi/p2p/IWifiP2pManager$Stub;->TRANSACTION_setMiracastMode:I
-Landroid/net/wifi/p2p/IWifiP2pManager;->checkConfigureWifiDisplayPermission()V
-Landroid/net/wifi/p2p/IWifiP2pManager;->close(Landroid/os/IBinder;)V
-Landroid/net/wifi/p2p/IWifiP2pManager;->getMessenger(Landroid/os/IBinder;)Landroid/os/Messenger;
-Landroid/net/wifi/p2p/IWifiP2pManager;->getP2pStateMachineMessenger()Landroid/os/Messenger;
-Landroid/net/wifi/p2p/IWifiP2pManager;->setMiracastMode(I)V
-Landroid/net/wifi/p2p/nsd/WifiP2pDnsSdServiceInfo;-><init>(Ljava/util/List;)V
-Landroid/net/wifi/p2p/nsd/WifiP2pDnsSdServiceInfo;->compressDnsName(Ljava/lang/String;)Ljava/lang/String;
-Landroid/net/wifi/p2p/nsd/WifiP2pDnsSdServiceInfo;->createPtrServiceQuery(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-Landroid/net/wifi/p2p/nsd/WifiP2pDnsSdServiceInfo;->createTxtServiceQuery(Ljava/lang/String;Ljava/lang/String;Landroid/net/nsd/DnsSdTxtRecord;)Ljava/lang/String;
-Landroid/net/wifi/p2p/nsd/WifiP2pDnsSdServiceInfo;->DNS_TYPE_PTR:I
-Landroid/net/wifi/p2p/nsd/WifiP2pDnsSdServiceInfo;->DNS_TYPE_TXT:I
-Landroid/net/wifi/p2p/nsd/WifiP2pDnsSdServiceInfo;->sVmPacket:Ljava/util/Map;
-Landroid/net/wifi/p2p/nsd/WifiP2pDnsSdServiceInfo;->VERSION_1:I
-Landroid/net/wifi/p2p/nsd/WifiP2pDnsSdServiceRequest;-><init>()V
-Landroid/net/wifi/p2p/nsd/WifiP2pDnsSdServiceRequest;-><init>(Ljava/lang/String;)V
-Landroid/net/wifi/p2p/nsd/WifiP2pDnsSdServiceRequest;-><init>(Ljava/lang/String;II)V
-Landroid/net/wifi/p2p/nsd/WifiP2pDnsSdServiceResponse;-><init>(IILandroid/net/wifi/p2p/WifiP2pDevice;[B)V
-Landroid/net/wifi/p2p/nsd/WifiP2pDnsSdServiceResponse;->getDnsQueryName()Ljava/lang/String;
-Landroid/net/wifi/p2p/nsd/WifiP2pDnsSdServiceResponse;->getDnsType()I
-Landroid/net/wifi/p2p/nsd/WifiP2pDnsSdServiceResponse;->getInstanceName()Ljava/lang/String;
-Landroid/net/wifi/p2p/nsd/WifiP2pDnsSdServiceResponse;->getTxtRecord()Ljava/util/Map;
-Landroid/net/wifi/p2p/nsd/WifiP2pDnsSdServiceResponse;->getVersion()I
-Landroid/net/wifi/p2p/nsd/WifiP2pDnsSdServiceResponse;->mDnsQueryName:Ljava/lang/String;
-Landroid/net/wifi/p2p/nsd/WifiP2pDnsSdServiceResponse;->mDnsType:I
-Landroid/net/wifi/p2p/nsd/WifiP2pDnsSdServiceResponse;->mInstanceName:Ljava/lang/String;
-Landroid/net/wifi/p2p/nsd/WifiP2pDnsSdServiceResponse;->mTxtRecord:Ljava/util/HashMap;
-Landroid/net/wifi/p2p/nsd/WifiP2pDnsSdServiceResponse;->mVersion:I
-Landroid/net/wifi/p2p/nsd/WifiP2pDnsSdServiceResponse;->newInstance(IILandroid/net/wifi/p2p/WifiP2pDevice;[B)Landroid/net/wifi/p2p/nsd/WifiP2pDnsSdServiceResponse;
-Landroid/net/wifi/p2p/nsd/WifiP2pDnsSdServiceResponse;->parse()Z
-Landroid/net/wifi/p2p/nsd/WifiP2pDnsSdServiceResponse;->readDnsName(Ljava/io/DataInputStream;)Ljava/lang/String;
-Landroid/net/wifi/p2p/nsd/WifiP2pDnsSdServiceResponse;->readTxtData(Ljava/io/DataInputStream;)Z
-Landroid/net/wifi/p2p/nsd/WifiP2pDnsSdServiceResponse;->sVmpack:Ljava/util/Map;
-Landroid/net/wifi/p2p/nsd/WifiP2pServiceInfo;->bin2HexStr([B)Ljava/lang/String;
-Landroid/net/wifi/p2p/nsd/WifiP2pServiceInfo;->getSupplicantQueryList()Ljava/util/List;
-Landroid/net/wifi/p2p/nsd/WifiP2pServiceInfo;->SERVICE_TYPE_WS_DISCOVERY:I
-Landroid/net/wifi/p2p/nsd/WifiP2pServiceRequest;-><init>(IIILjava/lang/String;)V
-Landroid/net/wifi/p2p/nsd/WifiP2pServiceRequest;->getSupplicantQuery()Ljava/lang/String;
-Landroid/net/wifi/p2p/nsd/WifiP2pServiceRequest;->getTransactionId()I
-Landroid/net/wifi/p2p/nsd/WifiP2pServiceRequest;->mLength:I
-Landroid/net/wifi/p2p/nsd/WifiP2pServiceRequest;->mProtocolType:I
-Landroid/net/wifi/p2p/nsd/WifiP2pServiceRequest;->mQuery:Ljava/lang/String;
-Landroid/net/wifi/p2p/nsd/WifiP2pServiceRequest;->mTransId:I
-Landroid/net/wifi/p2p/nsd/WifiP2pServiceRequest;->setTransactionId(I)V
-Landroid/net/wifi/p2p/nsd/WifiP2pServiceRequest;->validateQuery(Ljava/lang/String;)V
-Landroid/net/wifi/p2p/nsd/WifiP2pServiceResponse$Status;-><init>()V
-Landroid/net/wifi/p2p/nsd/WifiP2pServiceResponse$Status;->BAD_REQUEST:I
-Landroid/net/wifi/p2p/nsd/WifiP2pServiceResponse$Status;->REQUESTED_INFORMATION_NOT_AVAILABLE:I
-Landroid/net/wifi/p2p/nsd/WifiP2pServiceResponse$Status;->SERVICE_PROTOCOL_NOT_AVAILABLE:I
-Landroid/net/wifi/p2p/nsd/WifiP2pServiceResponse$Status;->SUCCESS:I
-Landroid/net/wifi/p2p/nsd/WifiP2pServiceResponse$Status;->toString(I)Ljava/lang/String;
-Landroid/net/wifi/p2p/nsd/WifiP2pServiceResponse;-><init>(IIILandroid/net/wifi/p2p/WifiP2pDevice;[B)V
-Landroid/net/wifi/p2p/nsd/WifiP2pServiceResponse;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/net/wifi/p2p/nsd/WifiP2pServiceResponse;->equals(Ljava/lang/Object;Ljava/lang/Object;)Z
-Landroid/net/wifi/p2p/nsd/WifiP2pServiceResponse;->getRawData()[B
-Landroid/net/wifi/p2p/nsd/WifiP2pServiceResponse;->getServiceType()I
-Landroid/net/wifi/p2p/nsd/WifiP2pServiceResponse;->getSrcDevice()Landroid/net/wifi/p2p/WifiP2pDevice;
-Landroid/net/wifi/p2p/nsd/WifiP2pServiceResponse;->getStatus()I
-Landroid/net/wifi/p2p/nsd/WifiP2pServiceResponse;->getTransactionId()I
-Landroid/net/wifi/p2p/nsd/WifiP2pServiceResponse;->hexStr2Bin(Ljava/lang/String;)[B
-Landroid/net/wifi/p2p/nsd/WifiP2pServiceResponse;->MAX_BUF_SIZE:I
-Landroid/net/wifi/p2p/nsd/WifiP2pServiceResponse;->mData:[B
-Landroid/net/wifi/p2p/nsd/WifiP2pServiceResponse;->mDevice:Landroid/net/wifi/p2p/WifiP2pDevice;
-Landroid/net/wifi/p2p/nsd/WifiP2pServiceResponse;->mServiceType:I
-Landroid/net/wifi/p2p/nsd/WifiP2pServiceResponse;->mStatus:I
-Landroid/net/wifi/p2p/nsd/WifiP2pServiceResponse;->mTransId:I
-Landroid/net/wifi/p2p/nsd/WifiP2pServiceResponse;->newInstance(Ljava/lang/String;[B)Ljava/util/List;
-Landroid/net/wifi/p2p/nsd/WifiP2pServiceResponse;->setSrcDevice(Landroid/net/wifi/p2p/WifiP2pDevice;)V
-Landroid/net/wifi/p2p/nsd/WifiP2pUpnpServiceInfo;-><init>(Ljava/util/List;)V
-Landroid/net/wifi/p2p/nsd/WifiP2pUpnpServiceInfo;->createSupplicantQuery(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-Landroid/net/wifi/p2p/nsd/WifiP2pUpnpServiceInfo;->VERSION_1_0:I
-Landroid/net/wifi/p2p/nsd/WifiP2pUpnpServiceRequest;-><init>()V
-Landroid/net/wifi/p2p/nsd/WifiP2pUpnpServiceRequest;-><init>(Ljava/lang/String;)V
-Landroid/net/wifi/p2p/nsd/WifiP2pUpnpServiceResponse;-><init>(IILandroid/net/wifi/p2p/WifiP2pDevice;[B)V
-Landroid/net/wifi/p2p/nsd/WifiP2pUpnpServiceResponse;->getUniqueServiceNames()Ljava/util/List;
-Landroid/net/wifi/p2p/nsd/WifiP2pUpnpServiceResponse;->getVersion()I
-Landroid/net/wifi/p2p/nsd/WifiP2pUpnpServiceResponse;->mUniqueServiceNames:Ljava/util/List;
-Landroid/net/wifi/p2p/nsd/WifiP2pUpnpServiceResponse;->mVersion:I
-Landroid/net/wifi/p2p/nsd/WifiP2pUpnpServiceResponse;->newInstance(IILandroid/net/wifi/p2p/WifiP2pDevice;[B)Landroid/net/wifi/p2p/nsd/WifiP2pUpnpServiceResponse;
-Landroid/net/wifi/p2p/nsd/WifiP2pUpnpServiceResponse;->parse()Z
-Landroid/net/wifi/p2p/WifiP2pConfig;->invalidate()V
-Landroid/net/wifi/p2p/WifiP2pConfig;->MAX_GROUP_OWNER_INTENT:I
-Landroid/net/wifi/p2p/WifiP2pDevice;->detailedDevicePattern:Ljava/util/regex/Pattern;
-Landroid/net/wifi/p2p/WifiP2pDevice;->DEVICE_CAPAB_CLIENT_DISCOVERABILITY:I
-Landroid/net/wifi/p2p/WifiP2pDevice;->DEVICE_CAPAB_CONCURRENT_OPER:I
-Landroid/net/wifi/p2p/WifiP2pDevice;->DEVICE_CAPAB_DEVICE_LIMIT:I
-Landroid/net/wifi/p2p/WifiP2pDevice;->DEVICE_CAPAB_INFRA_MANAGED:I
-Landroid/net/wifi/p2p/WifiP2pDevice;->DEVICE_CAPAB_INVITATION_PROCEDURE:I
-Landroid/net/wifi/p2p/WifiP2pDevice;->DEVICE_CAPAB_SERVICE_DISCOVERY:I
-Landroid/net/wifi/p2p/WifiP2pDevice;->GROUP_CAPAB_CROSS_CONN:I
-Landroid/net/wifi/p2p/WifiP2pDevice;->GROUP_CAPAB_GROUP_FORMATION:I
-Landroid/net/wifi/p2p/WifiP2pDevice;->GROUP_CAPAB_GROUP_LIMIT:I
-Landroid/net/wifi/p2p/WifiP2pDevice;->GROUP_CAPAB_GROUP_OWNER:I
-Landroid/net/wifi/p2p/WifiP2pDevice;->GROUP_CAPAB_INTRA_BSS_DIST:I
-Landroid/net/wifi/p2p/WifiP2pDevice;->GROUP_CAPAB_PERSISTENT_GROUP:I
-Landroid/net/wifi/p2p/WifiP2pDevice;->GROUP_CAPAB_PERSISTENT_RECONN:I
-Landroid/net/wifi/p2p/WifiP2pDevice;->isDeviceLimit()Z
-Landroid/net/wifi/p2p/WifiP2pDevice;->isGroupLimit()Z
-Landroid/net/wifi/p2p/WifiP2pDevice;->isInvitationCapable()Z
-Landroid/net/wifi/p2p/WifiP2pDevice;->parseHex(Ljava/lang/String;)I
-Landroid/net/wifi/p2p/WifiP2pDevice;->TAG:Ljava/lang/String;
-Landroid/net/wifi/p2p/WifiP2pDevice;->threeTokenPattern:Ljava/util/regex/Pattern;
-Landroid/net/wifi/p2p/WifiP2pDevice;->twoTokenPattern:Ljava/util/regex/Pattern;
-Landroid/net/wifi/p2p/WifiP2pDevice;->updateSupplicantDetails(Landroid/net/wifi/p2p/WifiP2pDevice;)V
-Landroid/net/wifi/p2p/WifiP2pDevice;->WPS_CONFIG_DISPLAY:I
-Landroid/net/wifi/p2p/WifiP2pDevice;->WPS_CONFIG_KEYPAD:I
-Landroid/net/wifi/p2p/WifiP2pDevice;->WPS_CONFIG_PUSHBUTTON:I
-Landroid/net/wifi/p2p/WifiP2pDeviceList;-><init>(Ljava/util/ArrayList;)V
-Landroid/net/wifi/p2p/WifiP2pDeviceList;->clear()Z
-Landroid/net/wifi/p2p/WifiP2pDeviceList;->isGroupOwner(Ljava/lang/String;)Z
-Landroid/net/wifi/p2p/WifiP2pDeviceList;->mDevices:Ljava/util/HashMap;
-Landroid/net/wifi/p2p/WifiP2pDeviceList;->remove(Landroid/net/wifi/p2p/WifiP2pDevice;)Z
-Landroid/net/wifi/p2p/WifiP2pDeviceList;->remove(Landroid/net/wifi/p2p/WifiP2pDeviceList;)Z
-Landroid/net/wifi/p2p/WifiP2pDeviceList;->updateGroupCapability(Ljava/lang/String;I)V
-Landroid/net/wifi/p2p/WifiP2pDeviceList;->updateStatus(Ljava/lang/String;I)V
-Landroid/net/wifi/p2p/WifiP2pDeviceList;->updateSupplicantDetails(Landroid/net/wifi/p2p/WifiP2pDevice;)V
-Landroid/net/wifi/p2p/WifiP2pDeviceList;->validateDevice(Landroid/net/wifi/p2p/WifiP2pDevice;)V
-Landroid/net/wifi/p2p/WifiP2pDeviceList;->validateDeviceAddress(Ljava/lang/String;)V
-Landroid/net/wifi/p2p/WifiP2pGroup;->addClient(Landroid/net/wifi/p2p/WifiP2pDevice;)V
-Landroid/net/wifi/p2p/WifiP2pGroup;->addClient(Ljava/lang/String;)V
-Landroid/net/wifi/p2p/WifiP2pGroup;->contains(Landroid/net/wifi/p2p/WifiP2pDevice;)Z
-Landroid/net/wifi/p2p/WifiP2pGroup;->groupStartedPattern:Ljava/util/regex/Pattern;
-Landroid/net/wifi/p2p/WifiP2pGroup;->mClients:Ljava/util/List;
-Landroid/net/wifi/p2p/WifiP2pGroup;->mInterface:Ljava/lang/String;
-Landroid/net/wifi/p2p/WifiP2pGroup;->mIsGroupOwner:Z
-Landroid/net/wifi/p2p/WifiP2pGroup;->mNetId:I
-Landroid/net/wifi/p2p/WifiP2pGroup;->mNetworkName:Ljava/lang/String;
-Landroid/net/wifi/p2p/WifiP2pGroup;->mOwner:Landroid/net/wifi/p2p/WifiP2pDevice;
-Landroid/net/wifi/p2p/WifiP2pGroup;->mPassphrase:Ljava/lang/String;
-Landroid/net/wifi/p2p/WifiP2pGroup;->PERSISTENT_NET_ID:I
-Landroid/net/wifi/p2p/WifiP2pGroup;->removeClient(Landroid/net/wifi/p2p/WifiP2pDevice;)Z
-Landroid/net/wifi/p2p/WifiP2pGroup;->removeClient(Ljava/lang/String;)Z
-Landroid/net/wifi/p2p/WifiP2pGroup;->setNetworkName(Ljava/lang/String;)V
-Landroid/net/wifi/p2p/WifiP2pGroup;->setOwner(Landroid/net/wifi/p2p/WifiP2pDevice;)V
-Landroid/net/wifi/p2p/WifiP2pGroup;->setPassphrase(Ljava/lang/String;)V
-Landroid/net/wifi/p2p/WifiP2pGroupList$GroupDeleteListener;->onDeleteGroup(I)V
-Landroid/net/wifi/p2p/WifiP2pGroupList;-><init>()V
-Landroid/net/wifi/p2p/WifiP2pGroupList;->add(Landroid/net/wifi/p2p/WifiP2pGroup;)V
-Landroid/net/wifi/p2p/WifiP2pGroupList;->clear()Z
-Landroid/net/wifi/p2p/WifiP2pGroupList;->contains(I)Z
-Landroid/net/wifi/p2p/WifiP2pGroupList;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/net/wifi/p2p/WifiP2pGroupList;->CREDENTIAL_MAX_NUM:I
-Landroid/net/wifi/p2p/WifiP2pGroupList;->getNetworkId(Ljava/lang/String;)I
-Landroid/net/wifi/p2p/WifiP2pGroupList;->getNetworkId(Ljava/lang/String;Ljava/lang/String;)I
-Landroid/net/wifi/p2p/WifiP2pGroupList;->getOwnerAddr(I)Ljava/lang/String;
-Landroid/net/wifi/p2p/WifiP2pGroupList;->isClearCalled:Z
-Landroid/net/wifi/p2p/WifiP2pGroupList;->mListener:Landroid/net/wifi/p2p/WifiP2pGroupList$GroupDeleteListener;
-Landroid/net/wifi/p2p/WifiP2pGroupList;->remove(I)V
-Landroid/net/wifi/p2p/WifiP2pGroupList;->remove(Ljava/lang/String;)V
-Landroid/net/wifi/p2p/WifiP2pManager$Channel;-><init>(Landroid/content/Context;Landroid/os/Looper;Landroid/net/wifi/p2p/WifiP2pManager$ChannelListener;Landroid/os/Binder;Landroid/net/wifi/p2p/WifiP2pManager;)V
-Landroid/net/wifi/p2p/WifiP2pManager$Channel;->getListener(I)Ljava/lang/Object;
-Landroid/net/wifi/p2p/WifiP2pManager$Channel;->handleDnsSdServiceResponse(Landroid/net/wifi/p2p/nsd/WifiP2pDnsSdServiceResponse;)V
-Landroid/net/wifi/p2p/WifiP2pManager$Channel;->handleServiceResponse(Landroid/net/wifi/p2p/nsd/WifiP2pServiceResponse;)V
-Landroid/net/wifi/p2p/WifiP2pManager$Channel;->handleUpnpServiceResponse(Landroid/net/wifi/p2p/nsd/WifiP2pUpnpServiceResponse;)V
-Landroid/net/wifi/p2p/WifiP2pManager$Channel;->INVALID_LISTENER_KEY:I
-Landroid/net/wifi/p2p/WifiP2pManager$Channel;->mBinder:Landroid/os/Binder;
-Landroid/net/wifi/p2p/WifiP2pManager$Channel;->mChannelListener:Landroid/net/wifi/p2p/WifiP2pManager$ChannelListener;
-Landroid/net/wifi/p2p/WifiP2pManager$Channel;->mCloseGuard:Ldalvik/system/CloseGuard;
-Landroid/net/wifi/p2p/WifiP2pManager$Channel;->mContext:Landroid/content/Context;
-Landroid/net/wifi/p2p/WifiP2pManager$Channel;->mDnsSdServRspListener:Landroid/net/wifi/p2p/WifiP2pManager$DnsSdServiceResponseListener;
-Landroid/net/wifi/p2p/WifiP2pManager$Channel;->mDnsSdTxtListener:Landroid/net/wifi/p2p/WifiP2pManager$DnsSdTxtRecordListener;
-Landroid/net/wifi/p2p/WifiP2pManager$Channel;->mHandler:Landroid/net/wifi/p2p/WifiP2pManager$Channel$P2pHandler;
-Landroid/net/wifi/p2p/WifiP2pManager$Channel;->mListenerKey:I
-Landroid/net/wifi/p2p/WifiP2pManager$Channel;->mListenerMap:Ljava/util/HashMap;
-Landroid/net/wifi/p2p/WifiP2pManager$Channel;->mListenerMapLock:Ljava/lang/Object;
-Landroid/net/wifi/p2p/WifiP2pManager$Channel;->mP2pManager:Landroid/net/wifi/p2p/WifiP2pManager;
-Landroid/net/wifi/p2p/WifiP2pManager$Channel;->mServRspListener:Landroid/net/wifi/p2p/WifiP2pManager$ServiceResponseListener;
-Landroid/net/wifi/p2p/WifiP2pManager$Channel;->mUpnpServRspListener:Landroid/net/wifi/p2p/WifiP2pManager$UpnpServiceResponseListener;
-Landroid/net/wifi/p2p/WifiP2pManager$HandoverMessageListener;->onHandoverMessageAvailable(Ljava/lang/String;)V
-Landroid/net/wifi/p2p/WifiP2pManager$PersistentGroupInfoListener;->onPersistentGroupInfoAvailable(Landroid/net/wifi/p2p/WifiP2pGroupList;)V
-Landroid/net/wifi/p2p/WifiP2pManager;->ADD_LOCAL_SERVICE:I
-Landroid/net/wifi/p2p/WifiP2pManager;->ADD_LOCAL_SERVICE_FAILED:I
-Landroid/net/wifi/p2p/WifiP2pManager;->ADD_LOCAL_SERVICE_SUCCEEDED:I
-Landroid/net/wifi/p2p/WifiP2pManager;->ADD_SERVICE_REQUEST:I
-Landroid/net/wifi/p2p/WifiP2pManager;->ADD_SERVICE_REQUEST_FAILED:I
-Landroid/net/wifi/p2p/WifiP2pManager;->ADD_SERVICE_REQUEST_SUCCEEDED:I
-Landroid/net/wifi/p2p/WifiP2pManager;->BASE:I
-Landroid/net/wifi/p2p/WifiP2pManager;->CALLING_PACKAGE:Ljava/lang/String;
-Landroid/net/wifi/p2p/WifiP2pManager;->CANCEL_CONNECT:I
-Landroid/net/wifi/p2p/WifiP2pManager;->CANCEL_CONNECT_FAILED:I
-Landroid/net/wifi/p2p/WifiP2pManager;->CANCEL_CONNECT_SUCCEEDED:I
-Landroid/net/wifi/p2p/WifiP2pManager;->checkChannel(Landroid/net/wifi/p2p/WifiP2pManager$Channel;)V
-Landroid/net/wifi/p2p/WifiP2pManager;->checkP2pConfig(Landroid/net/wifi/p2p/WifiP2pConfig;)V
-Landroid/net/wifi/p2p/WifiP2pManager;->checkServiceInfo(Landroid/net/wifi/p2p/nsd/WifiP2pServiceInfo;)V
-Landroid/net/wifi/p2p/WifiP2pManager;->checkServiceRequest(Landroid/net/wifi/p2p/nsd/WifiP2pServiceRequest;)V
-Landroid/net/wifi/p2p/WifiP2pManager;->CLEAR_LOCAL_SERVICES:I
-Landroid/net/wifi/p2p/WifiP2pManager;->CLEAR_LOCAL_SERVICES_FAILED:I
-Landroid/net/wifi/p2p/WifiP2pManager;->CLEAR_LOCAL_SERVICES_SUCCEEDED:I
-Landroid/net/wifi/p2p/WifiP2pManager;->CLEAR_SERVICE_REQUESTS:I
-Landroid/net/wifi/p2p/WifiP2pManager;->CLEAR_SERVICE_REQUESTS_FAILED:I
-Landroid/net/wifi/p2p/WifiP2pManager;->CLEAR_SERVICE_REQUESTS_SUCCEEDED:I
-Landroid/net/wifi/p2p/WifiP2pManager;->CONNECT:I
-Landroid/net/wifi/p2p/WifiP2pManager;->CONNECT_FAILED:I
-Landroid/net/wifi/p2p/WifiP2pManager;->CONNECT_SUCCEEDED:I
-Landroid/net/wifi/p2p/WifiP2pManager;->CREATE_GROUP_FAILED:I
-Landroid/net/wifi/p2p/WifiP2pManager;->CREATE_GROUP_SUCCEEDED:I
-Landroid/net/wifi/p2p/WifiP2pManager;->DELETE_PERSISTENT_GROUP:I
-Landroid/net/wifi/p2p/WifiP2pManager;->DELETE_PERSISTENT_GROUP_FAILED:I
-Landroid/net/wifi/p2p/WifiP2pManager;->DELETE_PERSISTENT_GROUP_SUCCEEDED:I
-Landroid/net/wifi/p2p/WifiP2pManager;->DISCOVER_PEERS:I
-Landroid/net/wifi/p2p/WifiP2pManager;->DISCOVER_PEERS_FAILED:I
-Landroid/net/wifi/p2p/WifiP2pManager;->DISCOVER_PEERS_SUCCEEDED:I
-Landroid/net/wifi/p2p/WifiP2pManager;->DISCOVER_SERVICES:I
-Landroid/net/wifi/p2p/WifiP2pManager;->DISCOVER_SERVICES_FAILED:I
-Landroid/net/wifi/p2p/WifiP2pManager;->DISCOVER_SERVICES_SUCCEEDED:I
-Landroid/net/wifi/p2p/WifiP2pManager;->EXTRA_HANDOVER_MESSAGE:Ljava/lang/String;
-Landroid/net/wifi/p2p/WifiP2pManager;->getMessenger(Landroid/os/Binder;)Landroid/os/Messenger;
-Landroid/net/wifi/p2p/WifiP2pManager;->getNfcHandoverRequest(Landroid/net/wifi/p2p/WifiP2pManager$Channel;Landroid/net/wifi/p2p/WifiP2pManager$HandoverMessageListener;)V
-Landroid/net/wifi/p2p/WifiP2pManager;->getNfcHandoverSelect(Landroid/net/wifi/p2p/WifiP2pManager$Channel;Landroid/net/wifi/p2p/WifiP2pManager$HandoverMessageListener;)V
-Landroid/net/wifi/p2p/WifiP2pManager;->getP2pStateMachineMessenger()Landroid/os/Messenger;
-Landroid/net/wifi/p2p/WifiP2pManager;->GET_HANDOVER_REQUEST:I
-Landroid/net/wifi/p2p/WifiP2pManager;->GET_HANDOVER_SELECT:I
-Landroid/net/wifi/p2p/WifiP2pManager;->initalizeChannel(Landroid/content/Context;Landroid/os/Looper;Landroid/net/wifi/p2p/WifiP2pManager$ChannelListener;Landroid/os/Messenger;Landroid/os/Binder;)Landroid/net/wifi/p2p/WifiP2pManager$Channel;
-Landroid/net/wifi/p2p/WifiP2pManager;->initializeInternal(Landroid/content/Context;Landroid/os/Looper;Landroid/net/wifi/p2p/WifiP2pManager$ChannelListener;)Landroid/net/wifi/p2p/WifiP2pManager$Channel;
-Landroid/net/wifi/p2p/WifiP2pManager;->initiatorReportNfcHandover(Landroid/net/wifi/p2p/WifiP2pManager$Channel;Ljava/lang/String;Landroid/net/wifi/p2p/WifiP2pManager$ActionListener;)V
-Landroid/net/wifi/p2p/WifiP2pManager;->INITIATOR_REPORT_NFC_HANDOVER:I
-Landroid/net/wifi/p2p/WifiP2pManager;->listen(Landroid/net/wifi/p2p/WifiP2pManager$Channel;ZLandroid/net/wifi/p2p/WifiP2pManager$ActionListener;)V
-Landroid/net/wifi/p2p/WifiP2pManager;->MIRACAST_DISABLED:I
-Landroid/net/wifi/p2p/WifiP2pManager;->MIRACAST_SINK:I
-Landroid/net/wifi/p2p/WifiP2pManager;->MIRACAST_SOURCE:I
-Landroid/net/wifi/p2p/WifiP2pManager;->mService:Landroid/net/wifi/p2p/IWifiP2pManager;
-Landroid/net/wifi/p2p/WifiP2pManager;->PING:I
-Landroid/net/wifi/p2p/WifiP2pManager;->REMOVE_GROUP:I
-Landroid/net/wifi/p2p/WifiP2pManager;->REMOVE_GROUP_FAILED:I
-Landroid/net/wifi/p2p/WifiP2pManager;->REMOVE_GROUP_SUCCEEDED:I
-Landroid/net/wifi/p2p/WifiP2pManager;->REMOVE_LOCAL_SERVICE:I
-Landroid/net/wifi/p2p/WifiP2pManager;->REMOVE_LOCAL_SERVICE_FAILED:I
-Landroid/net/wifi/p2p/WifiP2pManager;->REMOVE_LOCAL_SERVICE_SUCCEEDED:I
-Landroid/net/wifi/p2p/WifiP2pManager;->REMOVE_SERVICE_REQUEST:I
-Landroid/net/wifi/p2p/WifiP2pManager;->REMOVE_SERVICE_REQUEST_FAILED:I
-Landroid/net/wifi/p2p/WifiP2pManager;->REMOVE_SERVICE_REQUEST_SUCCEEDED:I
-Landroid/net/wifi/p2p/WifiP2pManager;->REPORT_NFC_HANDOVER_FAILED:I
-Landroid/net/wifi/p2p/WifiP2pManager;->REPORT_NFC_HANDOVER_SUCCEEDED:I
-Landroid/net/wifi/p2p/WifiP2pManager;->REQUEST_CONNECTION_INFO:I
-Landroid/net/wifi/p2p/WifiP2pManager;->REQUEST_GROUP_INFO:I
-Landroid/net/wifi/p2p/WifiP2pManager;->REQUEST_PEERS:I
-Landroid/net/wifi/p2p/WifiP2pManager;->REQUEST_PERSISTENT_GROUP_INFO:I
-Landroid/net/wifi/p2p/WifiP2pManager;->responderReportNfcHandover(Landroid/net/wifi/p2p/WifiP2pManager$Channel;Ljava/lang/String;Landroid/net/wifi/p2p/WifiP2pManager$ActionListener;)V
-Landroid/net/wifi/p2p/WifiP2pManager;->RESPONDER_REPORT_NFC_HANDOVER:I
-Landroid/net/wifi/p2p/WifiP2pManager;->RESPONSE_CONNECTION_INFO:I
-Landroid/net/wifi/p2p/WifiP2pManager;->RESPONSE_GET_HANDOVER_MESSAGE:I
-Landroid/net/wifi/p2p/WifiP2pManager;->RESPONSE_GROUP_INFO:I
-Landroid/net/wifi/p2p/WifiP2pManager;->RESPONSE_PEERS:I
-Landroid/net/wifi/p2p/WifiP2pManager;->RESPONSE_PERSISTENT_GROUP_INFO:I
-Landroid/net/wifi/p2p/WifiP2pManager;->RESPONSE_SERVICE:I
-Landroid/net/wifi/p2p/WifiP2pManager;->SET_CHANNEL:I
-Landroid/net/wifi/p2p/WifiP2pManager;->SET_CHANNEL_FAILED:I
-Landroid/net/wifi/p2p/WifiP2pManager;->SET_CHANNEL_SUCCEEDED:I
-Landroid/net/wifi/p2p/WifiP2pManager;->SET_DEVICE_NAME:I
-Landroid/net/wifi/p2p/WifiP2pManager;->SET_DEVICE_NAME_FAILED:I
-Landroid/net/wifi/p2p/WifiP2pManager;->SET_DEVICE_NAME_SUCCEEDED:I
-Landroid/net/wifi/p2p/WifiP2pManager;->SET_WFD_INFO:I
-Landroid/net/wifi/p2p/WifiP2pManager;->SET_WFD_INFO_FAILED:I
-Landroid/net/wifi/p2p/WifiP2pManager;->SET_WFD_INFO_SUCCEEDED:I
-Landroid/net/wifi/p2p/WifiP2pManager;->START_LISTEN:I
-Landroid/net/wifi/p2p/WifiP2pManager;->START_LISTEN_FAILED:I
-Landroid/net/wifi/p2p/WifiP2pManager;->START_LISTEN_SUCCEEDED:I
-Landroid/net/wifi/p2p/WifiP2pManager;->START_WPS:I
-Landroid/net/wifi/p2p/WifiP2pManager;->START_WPS_FAILED:I
-Landroid/net/wifi/p2p/WifiP2pManager;->START_WPS_SUCCEEDED:I
-Landroid/net/wifi/p2p/WifiP2pManager;->STOP_DISCOVERY:I
-Landroid/net/wifi/p2p/WifiP2pManager;->STOP_DISCOVERY_FAILED:I
-Landroid/net/wifi/p2p/WifiP2pManager;->STOP_DISCOVERY_SUCCEEDED:I
-Landroid/net/wifi/p2p/WifiP2pManager;->STOP_LISTEN:I
-Landroid/net/wifi/p2p/WifiP2pManager;->STOP_LISTEN_FAILED:I
-Landroid/net/wifi/p2p/WifiP2pManager;->STOP_LISTEN_SUCCEEDED:I
-Landroid/net/wifi/p2p/WifiP2pManager;->TAG:Ljava/lang/String;
-Landroid/net/wifi/p2p/WifiP2pManager;->WIFI_P2P_PERSISTENT_GROUPS_CHANGED_ACTION:Ljava/lang/String;
-Landroid/net/wifi/p2p/WifiP2pProvDiscEvent;-><init>(Ljava/lang/String;)V
-Landroid/net/wifi/p2p/WifiP2pProvDiscEvent;->ENTER_PIN:I
-Landroid/net/wifi/p2p/WifiP2pProvDiscEvent;->PBC_REQ:I
-Landroid/net/wifi/p2p/WifiP2pProvDiscEvent;->PBC_RSP:I
-Landroid/net/wifi/p2p/WifiP2pProvDiscEvent;->SHOW_PIN:I
-Landroid/net/wifi/p2p/WifiP2pProvDiscEvent;->TAG:Ljava/lang/String;
-Landroid/net/wifi/p2p/WifiP2pWfdInfo;->COUPLED_SINK_SUPPORT_AT_SINK:I
-Landroid/net/wifi/p2p/WifiP2pWfdInfo;->COUPLED_SINK_SUPPORT_AT_SOURCE:I
-Landroid/net/wifi/p2p/WifiP2pWfdInfo;->DEVICE_TYPE:I
-Landroid/net/wifi/p2p/WifiP2pWfdInfo;->getControlPort()I
-Landroid/net/wifi/p2p/WifiP2pWfdInfo;->getDeviceInfoHex()Ljava/lang/String;
-Landroid/net/wifi/p2p/WifiP2pWfdInfo;->getMaxThroughput()I
-Landroid/net/wifi/p2p/WifiP2pWfdInfo;->isCoupledSinkSupportedAtSink()Z
-Landroid/net/wifi/p2p/WifiP2pWfdInfo;->isCoupledSinkSupportedAtSource()Z
-Landroid/net/wifi/p2p/WifiP2pWfdInfo;->isSessionAvailable()Z
-Landroid/net/wifi/p2p/WifiP2pWfdInfo;->mCtrlPort:I
-Landroid/net/wifi/p2p/WifiP2pWfdInfo;->mDeviceInfo:I
-Landroid/net/wifi/p2p/WifiP2pWfdInfo;->mMaxThroughput:I
-Landroid/net/wifi/p2p/WifiP2pWfdInfo;->mWfdEnabled:Z
-Landroid/net/wifi/p2p/WifiP2pWfdInfo;->PRIMARY_SINK:I
-Landroid/net/wifi/p2p/WifiP2pWfdInfo;->readFromParcel(Landroid/os/Parcel;)V
-Landroid/net/wifi/p2p/WifiP2pWfdInfo;->SECONDARY_SINK:I
-Landroid/net/wifi/p2p/WifiP2pWfdInfo;->SESSION_AVAILABLE:I
-Landroid/net/wifi/p2p/WifiP2pWfdInfo;->SESSION_AVAILABLE_BIT1:I
-Landroid/net/wifi/p2p/WifiP2pWfdInfo;->SESSION_AVAILABLE_BIT2:I
-Landroid/net/wifi/p2p/WifiP2pWfdInfo;->setCoupledSinkSupportAtSink(Z)V
-Landroid/net/wifi/p2p/WifiP2pWfdInfo;->setCoupledSinkSupportAtSource(Z)V
-Landroid/net/wifi/p2p/WifiP2pWfdInfo;->SOURCE_OR_PRIMARY_SINK:I
-Landroid/net/wifi/p2p/WifiP2pWfdInfo;->TAG:Ljava/lang/String;
-Landroid/net/wifi/p2p/WifiP2pWfdInfo;->WFD_SOURCE:I
-Landroid/net/wifi/ParcelUtil;-><init>()V
-Landroid/net/wifi/ParcelUtil;->readCertificate(Landroid/os/Parcel;)Ljava/security/cert/X509Certificate;
-Landroid/net/wifi/ParcelUtil;->readCertificates(Landroid/os/Parcel;)[Ljava/security/cert/X509Certificate;
-Landroid/net/wifi/ParcelUtil;->readPrivateKey(Landroid/os/Parcel;)Ljava/security/PrivateKey;
-Landroid/net/wifi/ParcelUtil;->writeCertificate(Landroid/os/Parcel;Ljava/security/cert/X509Certificate;)V
-Landroid/net/wifi/ParcelUtil;->writeCertificates(Landroid/os/Parcel;[Ljava/security/cert/X509Certificate;)V
-Landroid/net/wifi/ParcelUtil;->writePrivateKey(Landroid/os/Parcel;Ljava/security/PrivateKey;)V
Landroid/net/wifi/PasspointManagementObjectDefinition;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
Landroid/net/wifi/PasspointManagementObjectDefinition;->CREATOR:Landroid/os/Parcelable$Creator;
Landroid/net/wifi/PasspointManagementObjectDefinition;->getBaseUri()Ljava/lang/String;
@@ -39647,121 +37055,6 @@
Landroid/net/wifi/RssiPacketCountInfo;->rxgood:I
Landroid/net/wifi/RssiPacketCountInfo;->txbad:I
Landroid/net/wifi/RssiPacketCountInfo;->txgood:I
-Landroid/net/wifi/rtt/IRttCallback$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/net/wifi/rtt/IRttCallback$Stub$Proxy;->getInterfaceDescriptor()Ljava/lang/String;
-Landroid/net/wifi/rtt/IRttCallback$Stub$Proxy;->mRemote:Landroid/os/IBinder;
-Landroid/net/wifi/rtt/IRttCallback$Stub$Proxy;->onRangingFailure(I)V
-Landroid/net/wifi/rtt/IRttCallback$Stub$Proxy;->onRangingResults(Ljava/util/List;)V
-Landroid/net/wifi/rtt/IRttCallback$Stub;-><init>()V
-Landroid/net/wifi/rtt/IRttCallback$Stub;->asInterface(Landroid/os/IBinder;)Landroid/net/wifi/rtt/IRttCallback;
-Landroid/net/wifi/rtt/IRttCallback$Stub;->DESCRIPTOR:Ljava/lang/String;
-Landroid/net/wifi/rtt/IRttCallback$Stub;->TRANSACTION_onRangingFailure:I
-Landroid/net/wifi/rtt/IRttCallback$Stub;->TRANSACTION_onRangingResults:I
-Landroid/net/wifi/rtt/IRttCallback;->onRangingFailure(I)V
-Landroid/net/wifi/rtt/IRttCallback;->onRangingResults(Ljava/util/List;)V
-Landroid/net/wifi/rtt/IWifiRttManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/net/wifi/rtt/IWifiRttManager$Stub$Proxy;->cancelRanging(Landroid/os/WorkSource;)V
-Landroid/net/wifi/rtt/IWifiRttManager$Stub$Proxy;->getInterfaceDescriptor()Ljava/lang/String;
-Landroid/net/wifi/rtt/IWifiRttManager$Stub$Proxy;->isAvailable()Z
-Landroid/net/wifi/rtt/IWifiRttManager$Stub$Proxy;->mRemote:Landroid/os/IBinder;
-Landroid/net/wifi/rtt/IWifiRttManager$Stub$Proxy;->startRanging(Landroid/os/IBinder;Ljava/lang/String;Landroid/os/WorkSource;Landroid/net/wifi/rtt/RangingRequest;Landroid/net/wifi/rtt/IRttCallback;)V
-Landroid/net/wifi/rtt/IWifiRttManager$Stub;-><init>()V
-Landroid/net/wifi/rtt/IWifiRttManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/net/wifi/rtt/IWifiRttManager;
-Landroid/net/wifi/rtt/IWifiRttManager$Stub;->DESCRIPTOR:Ljava/lang/String;
-Landroid/net/wifi/rtt/IWifiRttManager$Stub;->TRANSACTION_cancelRanging:I
-Landroid/net/wifi/rtt/IWifiRttManager$Stub;->TRANSACTION_isAvailable:I
-Landroid/net/wifi/rtt/IWifiRttManager$Stub;->TRANSACTION_startRanging:I
-Landroid/net/wifi/rtt/IWifiRttManager;->cancelRanging(Landroid/os/WorkSource;)V
-Landroid/net/wifi/rtt/IWifiRttManager;->isAvailable()Z
-Landroid/net/wifi/rtt/IWifiRttManager;->startRanging(Landroid/os/IBinder;Ljava/lang/String;Landroid/os/WorkSource;Landroid/net/wifi/rtt/RangingRequest;Landroid/net/wifi/rtt/IRttCallback;)V
-Landroid/net/wifi/rtt/RangingRequest$Builder;->mRttPeers:Ljava/util/List;
-Landroid/net/wifi/rtt/RangingRequest;-><init>(Ljava/util/List;)V
-Landroid/net/wifi/rtt/RangingRequest;->enforceValidity(Z)V
-Landroid/net/wifi/rtt/RangingRequest;->MAX_PEERS:I
-Landroid/net/wifi/rtt/RangingRequest;->mRttPeers:Ljava/util/List;
-Landroid/net/wifi/rtt/RangingResult;-><init>(ILandroid/net/MacAddress;IIIII[B[BJ)V
-Landroid/net/wifi/rtt/RangingResult;-><init>(ILandroid/net/wifi/aware/PeerHandle;IIIII[B[BJ)V
-Landroid/net/wifi/rtt/RangingResult;->EMPTY_BYTE_ARRAY:[B
-Landroid/net/wifi/rtt/RangingResult;->mDistanceMm:I
-Landroid/net/wifi/rtt/RangingResult;->mDistanceStdDevMm:I
-Landroid/net/wifi/rtt/RangingResult;->mLci:[B
-Landroid/net/wifi/rtt/RangingResult;->mLcr:[B
-Landroid/net/wifi/rtt/RangingResult;->mMac:Landroid/net/MacAddress;
-Landroid/net/wifi/rtt/RangingResult;->mNumAttemptedMeasurements:I
-Landroid/net/wifi/rtt/RangingResult;->mNumSuccessfulMeasurements:I
-Landroid/net/wifi/rtt/RangingResult;->mPeerHandle:Landroid/net/wifi/aware/PeerHandle;
-Landroid/net/wifi/rtt/RangingResult;->mRssi:I
-Landroid/net/wifi/rtt/RangingResult;->mStatus:I
-Landroid/net/wifi/rtt/RangingResult;->mTimestamp:J
-Landroid/net/wifi/rtt/RangingResult;->TAG:Ljava/lang/String;
-Landroid/net/wifi/rtt/ResponderConfig;-><init>(Landroid/net/MacAddress;Landroid/net/wifi/aware/PeerHandle;IZIIIII)V
-Landroid/net/wifi/rtt/ResponderConfig;->AWARE_BAND_2_DISCOVERY_CHANNEL:I
-Landroid/net/wifi/rtt/ResponderConfig;->isValid(Z)Z
-Landroid/net/wifi/rtt/ResponderConfig;->TAG:Ljava/lang/String;
-Landroid/net/wifi/rtt/ResponderConfig;->translateScanResultChannelWidth(I)I
-Landroid/net/wifi/rtt/WifiRttManager;-><init>(Landroid/content/Context;Landroid/net/wifi/rtt/IWifiRttManager;)V
-Landroid/net/wifi/rtt/WifiRttManager;->mContext:Landroid/content/Context;
-Landroid/net/wifi/rtt/WifiRttManager;->mService:Landroid/net/wifi/rtt/IWifiRttManager;
-Landroid/net/wifi/rtt/WifiRttManager;->TAG:Ljava/lang/String;
-Landroid/net/wifi/rtt/WifiRttManager;->VDBG:Z
-Landroid/net/wifi/RttManager$ParcelableRttParams;-><init>([Landroid/net/wifi/RttManager$RttParams;)V
-Landroid/net/wifi/RttManager$ParcelableRttParams;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/net/wifi/RttManager$ParcelableRttResults;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/net/wifi/RttManager$RttCapabilities;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/net/wifi/RttManager;-><init>(Landroid/content/Context;Landroid/net/wifi/rtt/WifiRttManager;)V
-Landroid/net/wifi/RttManager;->CMD_OP_REG_BINDER:I
-Landroid/net/wifi/RttManager;->DBG:Z
-Landroid/net/wifi/RttManager;->mContext:Landroid/content/Context;
-Landroid/net/wifi/RttManager;->mNewService:Landroid/net/wifi/rtt/WifiRttManager;
-Landroid/net/wifi/RttManager;->mRttCapabilities:Landroid/net/wifi/RttManager$RttCapabilities;
-Landroid/net/wifi/RttManager;->TAG:Ljava/lang/String;
-Landroid/net/wifi/ScanResult$InformationElement;-><init>()V
-Landroid/net/wifi/ScanResult$InformationElement;-><init>(Landroid/net/wifi/ScanResult$InformationElement;)V
-Landroid/net/wifi/ScanResult$InformationElement;->EID_HT_CAPABILITIES:I
-Landroid/net/wifi/ScanResult$InformationElement;->EID_VHT_CAPABILITIES:I
-Landroid/net/wifi/ScanResult$RadioChainInfo;-><init>()V
-Landroid/net/wifi/ScanResult$RadioChainInfo;->id:I
-Landroid/net/wifi/ScanResult$RadioChainInfo;->level:I
-Landroid/net/wifi/ScanResult;-><init>()V
-Landroid/net/wifi/ScanResult;-><init>(Landroid/net/wifi/ScanResult;)V
-Landroid/net/wifi/ScanResult;-><init>(Landroid/net/wifi/WifiSsid;Ljava/lang/String;JI[BLjava/lang/String;IIJ)V
-Landroid/net/wifi/ScanResult;-><init>(Landroid/net/wifi/WifiSsid;Ljava/lang/String;Ljava/lang/String;IIJII)V
-Landroid/net/wifi/ScanResult;-><init>(Landroid/net/wifi/WifiSsid;Ljava/lang/String;Ljava/lang/String;JILjava/lang/String;IIJIIIIIZ)V
-Landroid/net/wifi/ScanResult;-><init>(Ljava/lang/String;Ljava/lang/String;JILjava/lang/String;IIJIIIIIZ)V
-Landroid/net/wifi/ScanResult;->anqpElements:[Landroid/net/wifi/AnqpInformationElement;
-Landroid/net/wifi/ScanResult;->carrierApEapType:I
-Landroid/net/wifi/ScanResult;->carrierName:Ljava/lang/String;
-Landroid/net/wifi/ScanResult;->CIPHER_CCMP:I
-Landroid/net/wifi/ScanResult;->CIPHER_NONE:I
-Landroid/net/wifi/ScanResult;->CIPHER_NO_GROUP_ADDRESSED:I
-Landroid/net/wifi/ScanResult;->CIPHER_TKIP:I
-Landroid/net/wifi/ScanResult;->clearFlag(J)V
-Landroid/net/wifi/ScanResult;->FLAG_80211mc_RESPONDER:J
-Landroid/net/wifi/ScanResult;->FLAG_PASSPOINT_NETWORK:J
-Landroid/net/wifi/ScanResult;->is24GHz()Z
-Landroid/net/wifi/ScanResult;->is24GHz(I)Z
-Landroid/net/wifi/ScanResult;->is5GHz()Z
-Landroid/net/wifi/ScanResult;->is5GHz(I)Z
-Landroid/net/wifi/ScanResult;->isCarrierAp:Z
-Landroid/net/wifi/ScanResult;->KEY_MGMT_EAP:I
-Landroid/net/wifi/ScanResult;->KEY_MGMT_EAP_SHA256:I
-Landroid/net/wifi/ScanResult;->KEY_MGMT_FT_EAP:I
-Landroid/net/wifi/ScanResult;->KEY_MGMT_FT_PSK:I
-Landroid/net/wifi/ScanResult;->KEY_MGMT_NONE:I
-Landroid/net/wifi/ScanResult;->KEY_MGMT_OSEN:I
-Landroid/net/wifi/ScanResult;->KEY_MGMT_PSK:I
-Landroid/net/wifi/ScanResult;->KEY_MGMT_PSK_SHA256:I
-Landroid/net/wifi/ScanResult;->PROTOCOL_NONE:I
-Landroid/net/wifi/ScanResult;->PROTOCOL_OSEN:I
-Landroid/net/wifi/ScanResult;->PROTOCOL_WPA2:I
-Landroid/net/wifi/ScanResult;->PROTOCOL_WPA:I
-Landroid/net/wifi/ScanResult;->radioChainInfos:[Landroid/net/wifi/ScanResult$RadioChainInfo;
-Landroid/net/wifi/ScanResult;->setFlag(J)V
-Landroid/net/wifi/ScanResult;->UNSPECIFIED:I
-Landroid/net/wifi/SupplicantState;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/net/wifi/SupplicantState;->isConnecting(Landroid/net/wifi/SupplicantState;)Z
-Landroid/net/wifi/SupplicantState;->isDriverActive(Landroid/net/wifi/SupplicantState;)Z
-Landroid/net/wifi/SupplicantState;->isHandshakeState(Landroid/net/wifi/SupplicantState;)Z
Landroid/net/wifi/WifiActivityEnergyInfo;-><init>(JIJ[JJJJJ)V
Landroid/net/wifi/WifiActivityEnergyInfo;->CREATOR:Landroid/os/Parcelable$Creator;
Landroid/net/wifi/WifiActivityEnergyInfo;->getControllerEnergyUsed()J
@@ -39785,460 +37078,6 @@
Landroid/net/wifi/WifiActivityEnergyInfo;->STACK_STATE_STATE_ACTIVE:I
Landroid/net/wifi/WifiActivityEnergyInfo;->STACK_STATE_STATE_IDLE:I
Landroid/net/wifi/WifiActivityEnergyInfo;->STACK_STATE_STATE_SCANNING:I
-Landroid/net/wifi/WifiConfiguration$AuthAlgorithm;-><init>()V
-Landroid/net/wifi/WifiConfiguration$GroupCipher;-><init>()V
-Landroid/net/wifi/WifiConfiguration$GroupCipher;->GTK_NOT_USED:I
-Landroid/net/wifi/WifiConfiguration$KeyMgmt;-><init>()V
-Landroid/net/wifi/WifiConfiguration$KeyMgmt;->FT_EAP:I
-Landroid/net/wifi/WifiConfiguration$KeyMgmt;->FT_PSK:I
-Landroid/net/wifi/WifiConfiguration$KeyMgmt;->OSEN:I
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;-><init>()V
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->clearDisableReasonCounter()V
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->clearDisableReasonCounter(I)V
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->CONNECT_CHOICE_EXISTS:I
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->CONNECT_CHOICE_NOT_EXISTS:I
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->copy(Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;)V
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->DISABLED_ASSOCIATION_REJECTION:I
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->DISABLED_AUTHENTICATION_FAILURE:I
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->DISABLED_AUTHENTICATION_NO_CREDENTIALS:I
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->DISABLED_BAD_LINK:I
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->DISABLED_BY_WIFI_MANAGER:I
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->DISABLED_BY_WRONG_PASSWORD:I
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->DISABLED_DHCP_FAILURE:I
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->DISABLED_DNS_FAILURE:I
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->DISABLED_DUE_TO_USER_SWITCH:I
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->DISABLED_NO_INTERNET_PERMANENT:I
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->DISABLED_NO_INTERNET_TEMPORARY:I
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->DISABLED_TLS_VERSION_MISMATCH:I
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->DISABLED_WPS_START:I
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->getCandidate()Landroid/net/wifi/ScanResult;
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->getCandidateScore()I
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->getConnectChoice()Ljava/lang/String;
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->getConnectChoiceTimestamp()J
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->getDisableReasonCounter(I)I
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->getDisableTime()J
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->getHasEverConnected()Z
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->getNetworkDisableReasonString()Ljava/lang/String;
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->getNetworkDisableReasonString(I)Ljava/lang/String;
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->getNetworkSelectionBSSID()Ljava/lang/String;
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->getNetworkSelectionDisableReason()I
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->getNetworkSelectionStatus()I
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->getNetworkStatusString()Ljava/lang/String;
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->getSeenInLastQualifiedNetworkSelection()Z
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->incrementDisableReasonCounter(I)V
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->INVALID_NETWORK_SELECTION_DISABLE_TIMESTAMP:J
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->isDisabledByReason(I)Z
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->isNetworkEnabled()Z
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->isNetworkPermanentlyDisabled()Z
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->isNetworkTemporaryDisabled()Z
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->isNotRecommended()Z
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->mCandidate:Landroid/net/wifi/ScanResult;
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->mCandidateScore:I
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->mConnectChoice:Ljava/lang/String;
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->mConnectChoiceTimestamp:J
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->mHasEverConnected:Z
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->mNetworkSeclectionDisableCounter:[I
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->mNetworkSelectionBSSID:Ljava/lang/String;
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->mNetworkSelectionDisableReason:I
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->mNotRecommended:Z
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->mSeenInLastQualifiedNetworkSelection:Z
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->mStatus:I
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->mTemporarilyDisabledTimestamp:J
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->NETWORK_SELECTION_DISABLED_MAX:I
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->NETWORK_SELECTION_DISABLED_STARTING_INDEX:I
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->NETWORK_SELECTION_ENABLE:I
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->NETWORK_SELECTION_ENABLED:I
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->NETWORK_SELECTION_PERMANENTLY_DISABLED:I
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->NETWORK_SELECTION_STATUS_MAX:I
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->NETWORK_SELECTION_TEMPORARY_DISABLED:I
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->QUALITY_NETWORK_SELECTION_DISABLE_REASON:[Ljava/lang/String;
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->QUALITY_NETWORK_SELECTION_STATUS:[Ljava/lang/String;
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->readFromParcel(Landroid/os/Parcel;)V
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->setCandidate(Landroid/net/wifi/ScanResult;)V
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->setCandidateScore(I)V
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->setConnectChoice(Ljava/lang/String;)V
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->setConnectChoiceTimestamp(J)V
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->setDisableReasonCounter(II)V
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->setDisableTime(J)V
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->setHasEverConnected(Z)V
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->setNetworkSelectionBSSID(Ljava/lang/String;)V
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->setNetworkSelectionDisableReason(I)V
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->setNetworkSelectionStatus(I)V
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->setNotRecommended(Z)V
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->setSeenInLastQualifiedNetworkSelection(Z)V
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->writeToParcel(Landroid/os/Parcel;)V
-Landroid/net/wifi/WifiConfiguration$PairwiseCipher;-><init>()V
-Landroid/net/wifi/WifiConfiguration$Protocol;-><init>()V
-Landroid/net/wifi/WifiConfiguration$Protocol;->OSEN:I
-Landroid/net/wifi/WifiConfiguration$RecentFailure;-><init>()V
-Landroid/net/wifi/WifiConfiguration$RecentFailure;->clear()V
-Landroid/net/wifi/WifiConfiguration$RecentFailure;->getAssociationStatus()I
-Landroid/net/wifi/WifiConfiguration$RecentFailure;->mAssociationStatus:I
-Landroid/net/wifi/WifiConfiguration$RecentFailure;->NONE:I
-Landroid/net/wifi/WifiConfiguration$RecentFailure;->setAssociationStatus(I)V
-Landroid/net/wifi/WifiConfiguration$RecentFailure;->STATUS_AP_UNABLE_TO_HANDLE_NEW_STA:I
-Landroid/net/wifi/WifiConfiguration$Status;-><init>()V
-Landroid/net/wifi/WifiConfiguration;->AP_BAND_2GHZ:I
-Landroid/net/wifi/WifiConfiguration;->AP_BAND_5GHZ:I
-Landroid/net/wifi/WifiConfiguration;->AP_BAND_ANY:I
-Landroid/net/wifi/WifiConfiguration;->BACKUP_VERSION:I
-Landroid/net/wifi/WifiConfiguration;->bssidVarName:Ljava/lang/String;
-Landroid/net/wifi/WifiConfiguration;->configKey()Ljava/lang/String;
-Landroid/net/wifi/WifiConfiguration;->configKey(Z)Ljava/lang/String;
-Landroid/net/wifi/WifiConfiguration;->creationTime:Ljava/lang/String;
-Landroid/net/wifi/WifiConfiguration;->dhcpServer:Ljava/lang/String;
-Landroid/net/wifi/WifiConfiguration;->didSelfAdd:Z
-Landroid/net/wifi/WifiConfiguration;->dtimInterval:I
-Landroid/net/wifi/WifiConfiguration;->ephemeral:Z
-Landroid/net/wifi/WifiConfiguration;->getBytesForBackup()[B
-Landroid/net/wifi/WifiConfiguration;->getKeyIdForCredentials(Landroid/net/wifi/WifiConfiguration;)Ljava/lang/String;
-Landroid/net/wifi/WifiConfiguration;->getMoTree()Ljava/lang/String;
-Landroid/net/wifi/WifiConfiguration;->getNetworkSelectionStatus()Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;
-Landroid/net/wifi/WifiConfiguration;->getOrCreateRandomizedMacAddress()Landroid/net/MacAddress;
-Landroid/net/wifi/WifiConfiguration;->getRandomizedMacAddress()Landroid/net/MacAddress;
-Landroid/net/wifi/WifiConfiguration;->getWifiConfigFromBackup(Ljava/io/DataInputStream;)Landroid/net/wifi/WifiConfiguration;
-Landroid/net/wifi/WifiConfiguration;->hiddenSSIDVarName:Ljava/lang/String;
-Landroid/net/wifi/WifiConfiguration;->HOME_NETWORK_RSSI_BOOST:I
-Landroid/net/wifi/WifiConfiguration;->INVALID_NETWORK_ID:I
-Landroid/net/wifi/WifiConfiguration;->isLegacyPasspointConfig:Z
-Landroid/net/wifi/WifiConfiguration;->isLinked(Landroid/net/wifi/WifiConfiguration;)Z
-Landroid/net/wifi/WifiConfiguration;->isMetered(Landroid/net/wifi/WifiConfiguration;Landroid/net/wifi/WifiInfo;)Z
-Landroid/net/wifi/WifiConfiguration;->isOpenNetwork()Z
-Landroid/net/wifi/WifiConfiguration;->isValidMacAddressForRandomization(Landroid/net/MacAddress;)Z
-Landroid/net/wifi/WifiConfiguration;->lastConnected:J
-Landroid/net/wifi/WifiConfiguration;->lastDisconnected:J
-Landroid/net/wifi/WifiConfiguration;->linkedConfigurations:Ljava/util/HashMap;
-Landroid/net/wifi/WifiConfiguration;->LOCAL_ONLY_NETWORK_ID:I
-Landroid/net/wifi/WifiConfiguration;->MAXIMUM_RANDOM_MAC_GENERATION_RETRY:I
-Landroid/net/wifi/WifiConfiguration;->mCachedConfigKey:Ljava/lang/String;
-Landroid/net/wifi/WifiConfiguration;->meteredOverride:I
-Landroid/net/wifi/WifiConfiguration;->METERED_OVERRIDE_METERED:I
-Landroid/net/wifi/WifiConfiguration;->METERED_OVERRIDE_NONE:I
-Landroid/net/wifi/WifiConfiguration;->METERED_OVERRIDE_NOT_METERED:I
-Landroid/net/wifi/WifiConfiguration;->mNetworkSelectionStatus:Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;
-Landroid/net/wifi/WifiConfiguration;->mPasspointManagementObjectTree:Ljava/lang/String;
-Landroid/net/wifi/WifiConfiguration;->mRandomizedMacAddress:Landroid/net/MacAddress;
-Landroid/net/wifi/WifiConfiguration;->peerWifiConfiguration:Ljava/lang/String;
-Landroid/net/wifi/WifiConfiguration;->pmfVarName:Ljava/lang/String;
-Landroid/net/wifi/WifiConfiguration;->priorityVarName:Ljava/lang/String;
-Landroid/net/wifi/WifiConfiguration;->pskVarName:Ljava/lang/String;
-Landroid/net/wifi/WifiConfiguration;->readBitSet(Landroid/os/Parcel;)Ljava/util/BitSet;
-Landroid/net/wifi/WifiConfiguration;->recentFailure:Landroid/net/wifi/WifiConfiguration$RecentFailure;
-Landroid/net/wifi/WifiConfiguration;->requirePMF:Z
-Landroid/net/wifi/WifiConfiguration;->setNetworkSelectionStatus(Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;)V
-Landroid/net/wifi/WifiConfiguration;->setPasspointManagementObjectTree(Ljava/lang/String;)V
-Landroid/net/wifi/WifiConfiguration;->setRandomizedMacAddress(Landroid/net/MacAddress;)V
-Landroid/net/wifi/WifiConfiguration;->ssidVarName:Ljava/lang/String;
-Landroid/net/wifi/WifiConfiguration;->TAG:Ljava/lang/String;
-Landroid/net/wifi/WifiConfiguration;->trimStringForKeyId(Ljava/lang/String;)Ljava/lang/String;
-Landroid/net/wifi/WifiConfiguration;->UNKNOWN_UID:I
-Landroid/net/wifi/WifiConfiguration;->updateIdentiferVarName:Ljava/lang/String;
-Landroid/net/wifi/WifiConfiguration;->updateIdentifier:Ljava/lang/String;
-Landroid/net/wifi/WifiConfiguration;->updateTime:Ljava/lang/String;
-Landroid/net/wifi/WifiConfiguration;->userApproved:I
-Landroid/net/wifi/WifiConfiguration;->userApprovedAsString(I)Ljava/lang/String;
-Landroid/net/wifi/WifiConfiguration;->USER_APPROVED:I
-Landroid/net/wifi/WifiConfiguration;->USER_BANNED:I
-Landroid/net/wifi/WifiConfiguration;->USER_PENDING:I
-Landroid/net/wifi/WifiConfiguration;->USER_UNSPECIFIED:I
-Landroid/net/wifi/WifiConfiguration;->wepTxKeyIdxVarName:Ljava/lang/String;
-Landroid/net/wifi/WifiConfiguration;->writeBitSet(Landroid/os/Parcel;Ljava/util/BitSet;)V
-Landroid/net/wifi/WifiEnterpriseConfig$Eap;-><init>()V
-Landroid/net/wifi/WifiEnterpriseConfig$Eap;->strings:[Ljava/lang/String;
-Landroid/net/wifi/WifiEnterpriseConfig$Phase2;-><init>()V
-Landroid/net/wifi/WifiEnterpriseConfig$Phase2;->AUTHEAP_PREFIX:Ljava/lang/String;
-Landroid/net/wifi/WifiEnterpriseConfig$Phase2;->AUTH_PREFIX:Ljava/lang/String;
-Landroid/net/wifi/WifiEnterpriseConfig$Phase2;->strings:[Ljava/lang/String;
-Landroid/net/wifi/WifiEnterpriseConfig$SupplicantLoader;->loadValue(Ljava/lang/String;)Ljava/lang/String;
-Landroid/net/wifi/WifiEnterpriseConfig$SupplicantSaver;->saveValue(Ljava/lang/String;Ljava/lang/String;)Z
-Landroid/net/wifi/WifiEnterpriseConfig;->ALTSUBJECT_MATCH_KEY:Ljava/lang/String;
-Landroid/net/wifi/WifiEnterpriseConfig;->ANON_IDENTITY_KEY:Ljava/lang/String;
-Landroid/net/wifi/WifiEnterpriseConfig;->CA_CERT_ALIAS_DELIMITER:Ljava/lang/String;
-Landroid/net/wifi/WifiEnterpriseConfig;->CA_CERT_KEY:Ljava/lang/String;
-Landroid/net/wifi/WifiEnterpriseConfig;->CA_CERT_PREFIX:Ljava/lang/String;
-Landroid/net/wifi/WifiEnterpriseConfig;->CA_PATH_KEY:Ljava/lang/String;
-Landroid/net/wifi/WifiEnterpriseConfig;->CLIENT_CERT_KEY:Ljava/lang/String;
-Landroid/net/wifi/WifiEnterpriseConfig;->CLIENT_CERT_PREFIX:Ljava/lang/String;
-Landroid/net/wifi/WifiEnterpriseConfig;->convertToQuotedString(Ljava/lang/String;)Ljava/lang/String;
-Landroid/net/wifi/WifiEnterpriseConfig;->copyFrom(Landroid/net/wifi/WifiEnterpriseConfig;ZLjava/lang/String;)V
-Landroid/net/wifi/WifiEnterpriseConfig;->copyFromExternal(Landroid/net/wifi/WifiEnterpriseConfig;Ljava/lang/String;)V
-Landroid/net/wifi/WifiEnterpriseConfig;->decodeCaCertificateAlias(Ljava/lang/String;)Ljava/lang/String;
-Landroid/net/wifi/WifiEnterpriseConfig;->DOM_SUFFIX_MATCH_KEY:Ljava/lang/String;
-Landroid/net/wifi/WifiEnterpriseConfig;->EAP_KEY:Ljava/lang/String;
-Landroid/net/wifi/WifiEnterpriseConfig;->EMPTY_VALUE:Ljava/lang/String;
-Landroid/net/wifi/WifiEnterpriseConfig;->encodeCaCertificateAlias(Ljava/lang/String;)Ljava/lang/String;
-Landroid/net/wifi/WifiEnterpriseConfig;->ENGINE_DISABLE:Ljava/lang/String;
-Landroid/net/wifi/WifiEnterpriseConfig;->ENGINE_ENABLE:Ljava/lang/String;
-Landroid/net/wifi/WifiEnterpriseConfig;->ENGINE_ID_KEY:Ljava/lang/String;
-Landroid/net/wifi/WifiEnterpriseConfig;->ENGINE_ID_KEYSTORE:Ljava/lang/String;
-Landroid/net/wifi/WifiEnterpriseConfig;->ENGINE_KEY:Ljava/lang/String;
-Landroid/net/wifi/WifiEnterpriseConfig;->getCaCertificateAliases()[Ljava/lang/String;
-Landroid/net/wifi/WifiEnterpriseConfig;->getCaPath()Ljava/lang/String;
-Landroid/net/wifi/WifiEnterpriseConfig;->getClientPrivateKey()Ljava/security/PrivateKey;
-Landroid/net/wifi/WifiEnterpriseConfig;->getFieldValue(Ljava/lang/String;)Ljava/lang/String;
-Landroid/net/wifi/WifiEnterpriseConfig;->getFieldValue(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-Landroid/net/wifi/WifiEnterpriseConfig;->getKeyId(Landroid/net/wifi/WifiEnterpriseConfig;)Ljava/lang/String;
-Landroid/net/wifi/WifiEnterpriseConfig;->getStringIndex([Ljava/lang/String;Ljava/lang/String;I)I
-Landroid/net/wifi/WifiEnterpriseConfig;->IDENTITY_KEY:Ljava/lang/String;
-Landroid/net/wifi/WifiEnterpriseConfig;->isEapMethodValid()Z
-Landroid/net/wifi/WifiEnterpriseConfig;->KEYSTORES_URI:Ljava/lang/String;
-Landroid/net/wifi/WifiEnterpriseConfig;->KEYSTORE_URI:Ljava/lang/String;
-Landroid/net/wifi/WifiEnterpriseConfig;->loadFromSupplicant(Landroid/net/wifi/WifiEnterpriseConfig$SupplicantLoader;)V
-Landroid/net/wifi/WifiEnterpriseConfig;->mCaCerts:[Ljava/security/cert/X509Certificate;
-Landroid/net/wifi/WifiEnterpriseConfig;->mClientCertificateChain:[Ljava/security/cert/X509Certificate;
-Landroid/net/wifi/WifiEnterpriseConfig;->mClientPrivateKey:Ljava/security/PrivateKey;
-Landroid/net/wifi/WifiEnterpriseConfig;->mEapMethod:I
-Landroid/net/wifi/WifiEnterpriseConfig;->mPhase2Method:I
-Landroid/net/wifi/WifiEnterpriseConfig;->OPP_KEY_CACHING:Ljava/lang/String;
-Landroid/net/wifi/WifiEnterpriseConfig;->PASSWORD_KEY:Ljava/lang/String;
-Landroid/net/wifi/WifiEnterpriseConfig;->PHASE2_KEY:Ljava/lang/String;
-Landroid/net/wifi/WifiEnterpriseConfig;->PLMN_KEY:Ljava/lang/String;
-Landroid/net/wifi/WifiEnterpriseConfig;->PRIVATE_KEY_ID_KEY:Ljava/lang/String;
-Landroid/net/wifi/WifiEnterpriseConfig;->REALM_KEY:Ljava/lang/String;
-Landroid/net/wifi/WifiEnterpriseConfig;->removeDoubleQuotes(Ljava/lang/String;)Ljava/lang/String;
-Landroid/net/wifi/WifiEnterpriseConfig;->resetCaCertificate()V
-Landroid/net/wifi/WifiEnterpriseConfig;->resetClientKeyEntry()V
-Landroid/net/wifi/WifiEnterpriseConfig;->saveToSupplicant(Landroid/net/wifi/WifiEnterpriseConfig$SupplicantSaver;)Z
-Landroid/net/wifi/WifiEnterpriseConfig;->setCaCertificateAliases([Ljava/lang/String;)V
-Landroid/net/wifi/WifiEnterpriseConfig;->setCaPath(Ljava/lang/String;)V
-Landroid/net/wifi/WifiEnterpriseConfig;->setFieldValue(Ljava/lang/String;Ljava/lang/String;)V
-Landroid/net/wifi/WifiEnterpriseConfig;->setFieldValue(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
-Landroid/net/wifi/WifiEnterpriseConfig;->SUBJECT_MATCH_KEY:Ljava/lang/String;
-Landroid/net/wifi/WifiEnterpriseConfig;->SUPPLICANT_CONFIG_KEYS:[Ljava/lang/String;
-Landroid/net/wifi/WifiEnterpriseConfig;->TAG:Ljava/lang/String;
-Landroid/net/wifi/WifiEnterpriseConfig;->UNQUOTED_KEYS:Ljava/util/List;
-Landroid/net/wifi/WifiInfo;-><init>(Landroid/net/wifi/WifiInfo;)V
-Landroid/net/wifi/WifiInfo;->hasRealMacAddress()Z
-Landroid/net/wifi/WifiInfo;->is24GHz()Z
-Landroid/net/wifi/WifiInfo;->MAX_RSSI:I
-Landroid/net/wifi/WifiInfo;->mEphemeral:Z
-Landroid/net/wifi/WifiInfo;->mFrequency:I
-Landroid/net/wifi/WifiInfo;->MIN_RSSI:I
-Landroid/net/wifi/WifiInfo;->mLinkSpeed:I
-Landroid/net/wifi/WifiInfo;->mMeteredHint:Z
-Landroid/net/wifi/WifiInfo;->mNetworkId:I
-Landroid/net/wifi/WifiInfo;->mRssi:I
-Landroid/net/wifi/WifiInfo;->mSupplicantState:Landroid/net/wifi/SupplicantState;
-Landroid/net/wifi/WifiInfo;->reset()V
-Landroid/net/wifi/WifiInfo;->rxSuccess:J
-Landroid/net/wifi/WifiInfo;->rxSuccessRate:D
-Landroid/net/wifi/WifiInfo;->setEphemeral(Z)V
-Landroid/net/wifi/WifiInfo;->setFrequency(I)V
-Landroid/net/wifi/WifiInfo;->setInetAddress(Ljava/net/InetAddress;)V
-Landroid/net/wifi/WifiInfo;->setMeteredHint(Z)V
-Landroid/net/wifi/WifiInfo;->setSSID(Landroid/net/wifi/WifiSsid;)V
-Landroid/net/wifi/WifiInfo;->stateMap:Ljava/util/EnumMap;
-Landroid/net/wifi/WifiInfo;->TAG:Ljava/lang/String;
-Landroid/net/wifi/WifiInfo;->txBad:J
-Landroid/net/wifi/WifiInfo;->txBadRate:D
-Landroid/net/wifi/WifiInfo;->txRetries:J
-Landroid/net/wifi/WifiInfo;->txRetriesRate:D
-Landroid/net/wifi/WifiInfo;->txSuccess:J
-Landroid/net/wifi/WifiInfo;->txSuccessRate:D
-Landroid/net/wifi/WifiInfo;->valueOf(Ljava/lang/String;)Landroid/net/wifi/SupplicantState;
-Landroid/net/wifi/WifiManager$LocalOnlyHotspotCallback;->REQUEST_REGISTERED:I
-Landroid/net/wifi/WifiManager$LocalOnlyHotspotCallbackProxy;-><init>(Landroid/net/wifi/WifiManager;Landroid/os/Looper;Landroid/net/wifi/WifiManager$LocalOnlyHotspotCallback;)V
-Landroid/net/wifi/WifiManager$LocalOnlyHotspotCallbackProxy;->getMessenger()Landroid/os/Messenger;
-Landroid/net/wifi/WifiManager$LocalOnlyHotspotCallbackProxy;->mHandler:Landroid/os/Handler;
-Landroid/net/wifi/WifiManager$LocalOnlyHotspotCallbackProxy;->mLooper:Landroid/os/Looper;
-Landroid/net/wifi/WifiManager$LocalOnlyHotspotCallbackProxy;->mMessenger:Landroid/os/Messenger;
-Landroid/net/wifi/WifiManager$LocalOnlyHotspotCallbackProxy;->mWifiManager:Ljava/lang/ref/WeakReference;
-Landroid/net/wifi/WifiManager$LocalOnlyHotspotCallbackProxy;->notifyFailed(I)V
-Landroid/net/wifi/WifiManager$LocalOnlyHotspotObserver;-><init>()V
-Landroid/net/wifi/WifiManager$LocalOnlyHotspotObserver;->onRegistered(Landroid/net/wifi/WifiManager$LocalOnlyHotspotSubscription;)V
-Landroid/net/wifi/WifiManager$LocalOnlyHotspotObserver;->onStarted(Landroid/net/wifi/WifiConfiguration;)V
-Landroid/net/wifi/WifiManager$LocalOnlyHotspotObserver;->onStopped()V
-Landroid/net/wifi/WifiManager$LocalOnlyHotspotObserverProxy;-><init>(Landroid/net/wifi/WifiManager;Landroid/os/Looper;Landroid/net/wifi/WifiManager$LocalOnlyHotspotObserver;)V
-Landroid/net/wifi/WifiManager$LocalOnlyHotspotObserverProxy;->getMessenger()Landroid/os/Messenger;
-Landroid/net/wifi/WifiManager$LocalOnlyHotspotObserverProxy;->mHandler:Landroid/os/Handler;
-Landroid/net/wifi/WifiManager$LocalOnlyHotspotObserverProxy;->mLooper:Landroid/os/Looper;
-Landroid/net/wifi/WifiManager$LocalOnlyHotspotObserverProxy;->mMessenger:Landroid/os/Messenger;
-Landroid/net/wifi/WifiManager$LocalOnlyHotspotObserverProxy;->mWifiManager:Ljava/lang/ref/WeakReference;
-Landroid/net/wifi/WifiManager$LocalOnlyHotspotObserverProxy;->registered()V
-Landroid/net/wifi/WifiManager$LocalOnlyHotspotReservation;->mCloseGuard:Ldalvik/system/CloseGuard;
-Landroid/net/wifi/WifiManager$LocalOnlyHotspotReservation;->mConfig:Landroid/net/wifi/WifiConfiguration;
-Landroid/net/wifi/WifiManager$LocalOnlyHotspotSubscription;->mCloseGuard:Ldalvik/system/CloseGuard;
-Landroid/net/wifi/WifiManager$MulticastLock;->mBinder:Landroid/os/IBinder;
-Landroid/net/wifi/WifiManager$MulticastLock;->mHeld:Z
-Landroid/net/wifi/WifiManager$MulticastLock;->mRefCount:I
-Landroid/net/wifi/WifiManager$MulticastLock;->mRefCounted:Z
-Landroid/net/wifi/WifiManager$MulticastLock;->mTag:Ljava/lang/String;
-Landroid/net/wifi/WifiManager$ProvisioningCallbackProxy;-><init>(Landroid/os/Looper;Landroid/net/wifi/hotspot2/ProvisioningCallback;)V
-Landroid/net/wifi/WifiManager$ProvisioningCallbackProxy;->mCallback:Landroid/net/wifi/hotspot2/ProvisioningCallback;
-Landroid/net/wifi/WifiManager$ProvisioningCallbackProxy;->mHandler:Landroid/os/Handler;
-Landroid/net/wifi/WifiManager$ProvisioningCallbackProxy;->onProvisioningFailure(I)V
-Landroid/net/wifi/WifiManager$ProvisioningCallbackProxy;->onProvisioningStatus(I)V
-Landroid/net/wifi/WifiManager$ServiceHandler;->dispatchMessageToListeners(Landroid/os/Message;)V
-Landroid/net/wifi/WifiManager$SoftApCallback;->onNumClientsChanged(I)V
-Landroid/net/wifi/WifiManager$SoftApCallback;->onStateChanged(II)V
-Landroid/net/wifi/WifiManager$SoftApCallbackProxy;-><init>(Landroid/os/Looper;Landroid/net/wifi/WifiManager$SoftApCallback;)V
-Landroid/net/wifi/WifiManager$SoftApCallbackProxy;->mCallback:Landroid/net/wifi/WifiManager$SoftApCallback;
-Landroid/net/wifi/WifiManager$SoftApCallbackProxy;->mHandler:Landroid/os/Handler;
-Landroid/net/wifi/WifiManager$SoftApCallbackProxy;->onNumClientsChanged(I)V
-Landroid/net/wifi/WifiManager$SoftApCallbackProxy;->onStateChanged(II)V
-Landroid/net/wifi/WifiManager$TxPacketCountListener;->onFailure(I)V
-Landroid/net/wifi/WifiManager$TxPacketCountListener;->onSuccess(I)V
-Landroid/net/wifi/WifiManager$WifiLock;->mBinder:Landroid/os/IBinder;
-Landroid/net/wifi/WifiManager$WifiLock;->mHeld:Z
-Landroid/net/wifi/WifiManager$WifiLock;->mLockType:I
-Landroid/net/wifi/WifiManager$WifiLock;->mRefCount:I
-Landroid/net/wifi/WifiManager$WifiLock;->mRefCounted:Z
-Landroid/net/wifi/WifiManager$WifiLock;->mTag:Ljava/lang/String;
-Landroid/net/wifi/WifiManager$WifiLock;->mWorkSource:Landroid/os/WorkSource;
-Landroid/net/wifi/WifiManager;-><init>(Landroid/content/Context;Landroid/net/wifi/IWifiManager;Landroid/os/Looper;)V
-Landroid/net/wifi/WifiManager;->ACTION_PASSPOINT_DEAUTH_IMMINENT:Ljava/lang/String;
-Landroid/net/wifi/WifiManager;->ACTION_PASSPOINT_ICON:Ljava/lang/String;
-Landroid/net/wifi/WifiManager;->ACTION_PASSPOINT_OSU_PROVIDERS_LIST:Ljava/lang/String;
-Landroid/net/wifi/WifiManager;->ACTION_PASSPOINT_SUBSCRIPTION_REMEDIATION:Ljava/lang/String;
-Landroid/net/wifi/WifiManager;->ACTION_REQUEST_DISABLE:Ljava/lang/String;
-Landroid/net/wifi/WifiManager;->ACTION_REQUEST_ENABLE:Ljava/lang/String;
-Landroid/net/wifi/WifiManager;->addOrUpdateNetwork(Landroid/net/wifi/WifiConfiguration;)I
-Landroid/net/wifi/WifiManager;->BASE:I
-Landroid/net/wifi/WifiManager;->BATCHED_SCAN_RESULTS_AVAILABLE_ACTION:Ljava/lang/String;
-Landroid/net/wifi/WifiManager;->BUSY:I
-Landroid/net/wifi/WifiManager;->CANCEL_WPS:I
-Landroid/net/wifi/WifiManager;->CANCEL_WPS_FAILED:I
-Landroid/net/wifi/WifiManager;->CANCEL_WPS_SUCCEDED:I
-Landroid/net/wifi/WifiManager;->CONNECT_NETWORK:I
-Landroid/net/wifi/WifiManager;->CONNECT_NETWORK_FAILED:I
-Landroid/net/wifi/WifiManager;->CONNECT_NETWORK_SUCCEEDED:I
-Landroid/net/wifi/WifiManager;->DATA_ACTIVITY_IN:I
-Landroid/net/wifi/WifiManager;->DATA_ACTIVITY_INOUT:I
-Landroid/net/wifi/WifiManager;->DATA_ACTIVITY_NONE:I
-Landroid/net/wifi/WifiManager;->DATA_ACTIVITY_NOTIFICATION:I
-Landroid/net/wifi/WifiManager;->DATA_ACTIVITY_OUT:I
-Landroid/net/wifi/WifiManager;->deauthenticateNetwork(JZ)V
-Landroid/net/wifi/WifiManager;->DEFAULT_POOR_NETWORK_AVOIDANCE_ENABLED:Z
-Landroid/net/wifi/WifiManager;->disableEphemeralNetwork(Ljava/lang/String;)V
-Landroid/net/wifi/WifiManager;->DISABLE_NETWORK:I
-Landroid/net/wifi/WifiManager;->DISABLE_NETWORK_FAILED:I
-Landroid/net/wifi/WifiManager;->DISABLE_NETWORK_SUCCEEDED:I
-Landroid/net/wifi/WifiManager;->enableWifiConnectivityManager(Z)V
-Landroid/net/wifi/WifiManager;->ERROR:I
-Landroid/net/wifi/WifiManager;->ERROR_AUTH_FAILURE_EAP_FAILURE:I
-Landroid/net/wifi/WifiManager;->ERROR_AUTH_FAILURE_NONE:I
-Landroid/net/wifi/WifiManager;->ERROR_AUTH_FAILURE_TIMEOUT:I
-Landroid/net/wifi/WifiManager;->ERROR_AUTH_FAILURE_WRONG_PSWD:I
-Landroid/net/wifi/WifiManager;->EXTRA_ANQP_ELEMENT_DATA:Ljava/lang/String;
-Landroid/net/wifi/WifiManager;->EXTRA_BSSID_LONG:Ljava/lang/String;
-Landroid/net/wifi/WifiManager;->EXTRA_DELAY:Ljava/lang/String;
-Landroid/net/wifi/WifiManager;->EXTRA_ESS:Ljava/lang/String;
-Landroid/net/wifi/WifiManager;->EXTRA_FILENAME:Ljava/lang/String;
-Landroid/net/wifi/WifiManager;->EXTRA_ICON:Ljava/lang/String;
-Landroid/net/wifi/WifiManager;->EXTRA_LINK_PROPERTIES:Ljava/lang/String;
-Landroid/net/wifi/WifiManager;->EXTRA_NETWORK_CAPABILITIES:Ljava/lang/String;
-Landroid/net/wifi/WifiManager;->EXTRA_SCAN_AVAILABLE:Ljava/lang/String;
-Landroid/net/wifi/WifiManager;->EXTRA_SUBSCRIPTION_REMEDIATION_METHOD:Ljava/lang/String;
-Landroid/net/wifi/WifiManager;->EXTRA_SUPPLICANT_ERROR_REASON:Ljava/lang/String;
-Landroid/net/wifi/WifiManager;->EXTRA_URL:Ljava/lang/String;
-Landroid/net/wifi/WifiManager;->EXTRA_WIFI_AP_FAILURE_REASON:Ljava/lang/String;
-Landroid/net/wifi/WifiManager;->EXTRA_WIFI_AP_INTERFACE_NAME:Ljava/lang/String;
-Landroid/net/wifi/WifiManager;->EXTRA_WIFI_AP_MODE:Ljava/lang/String;
-Landroid/net/wifi/WifiManager;->factoryReset()V
-Landroid/net/wifi/WifiManager;->FORGET_NETWORK:I
-Landroid/net/wifi/WifiManager;->FORGET_NETWORK_FAILED:I
-Landroid/net/wifi/WifiManager;->FORGET_NETWORK_SUCCEEDED:I
-Landroid/net/wifi/WifiManager;->getAllMatchingWifiConfigs(Landroid/net/wifi/ScanResult;)Ljava/util/List;
-Landroid/net/wifi/WifiManager;->getChannel()Lcom/android/internal/util/AsyncChannel;
-Landroid/net/wifi/WifiManager;->getControllerActivityEnergyInfo(I)Landroid/net/wifi/WifiActivityEnergyInfo;
-Landroid/net/wifi/WifiManager;->getCurrentNetworkWpsNfcConfigurationToken()Ljava/lang/String;
-Landroid/net/wifi/WifiManager;->getEnableAutoJoinWhenAssociated()Z
-Landroid/net/wifi/WifiManager;->getMatchingOsuProviders(Landroid/net/wifi/ScanResult;)Ljava/util/List;
-Landroid/net/wifi/WifiManager;->getSupportedFeatures()I
-Landroid/net/wifi/WifiManager;->getTxPacketCount(Landroid/net/wifi/WifiManager$TxPacketCountListener;)V
-Landroid/net/wifi/WifiManager;->HOTSPOT_FAILED:I
-Landroid/net/wifi/WifiManager;->HOTSPOT_OBSERVER_REGISTERED:I
-Landroid/net/wifi/WifiManager;->HOTSPOT_STARTED:I
-Landroid/net/wifi/WifiManager;->HOTSPOT_STOPPED:I
-Landroid/net/wifi/WifiManager;->IFACE_IP_MODE_CONFIGURATION_ERROR:I
-Landroid/net/wifi/WifiManager;->IFACE_IP_MODE_LOCAL_ONLY:I
-Landroid/net/wifi/WifiManager;->IFACE_IP_MODE_TETHERED:I
-Landroid/net/wifi/WifiManager;->IFACE_IP_MODE_UNSPECIFIED:I
-Landroid/net/wifi/WifiManager;->INVALID_ARGS:I
-Landroid/net/wifi/WifiManager;->INVALID_KEY:I
-Landroid/net/wifi/WifiManager;->IN_PROGRESS:I
-Landroid/net/wifi/WifiManager;->isAdditionalStaSupported()Z
-Landroid/net/wifi/WifiManager;->isDualModeSupported()Z
-Landroid/net/wifi/WifiManager;->isFeatureSupported(I)Z
-Landroid/net/wifi/WifiManager;->isMulticastEnabled()Z
-Landroid/net/wifi/WifiManager;->isOffChannelTdlsSupported()Z
-Landroid/net/wifi/WifiManager;->isPasspointSupported()Z
-Landroid/net/wifi/WifiManager;->isWifiAwareSupported()Z
-Landroid/net/wifi/WifiManager;->mAsyncChannel:Lcom/android/internal/util/AsyncChannel;
-Landroid/net/wifi/WifiManager;->matchProviderWithCurrentNetwork(Ljava/lang/String;)I
-Landroid/net/wifi/WifiManager;->MAX_ACTIVE_LOCKS:I
-Landroid/net/wifi/WifiManager;->mConnected:Ljava/util/concurrent/CountDownLatch;
-Landroid/net/wifi/WifiManager;->mContext:Landroid/content/Context;
-Landroid/net/wifi/WifiManager;->mListenerKey:I
-Landroid/net/wifi/WifiManager;->mListenerMap:Landroid/util/SparseArray;
-Landroid/net/wifi/WifiManager;->mListenerMapLock:Ljava/lang/Object;
-Landroid/net/wifi/WifiManager;->mLock:Ljava/lang/Object;
-Landroid/net/wifi/WifiManager;->mLOHSCallbackProxy:Landroid/net/wifi/WifiManager$LocalOnlyHotspotCallbackProxy;
-Landroid/net/wifi/WifiManager;->mLOHSObserverProxy:Landroid/net/wifi/WifiManager$LocalOnlyHotspotObserverProxy;
-Landroid/net/wifi/WifiManager;->mLooper:Landroid/os/Looper;
-Landroid/net/wifi/WifiManager;->mTargetSdkVersion:I
-Landroid/net/wifi/WifiManager;->NOT_AUTHORIZED:I
-Landroid/net/wifi/WifiManager;->putListener(Ljava/lang/Object;)I
-Landroid/net/wifi/WifiManager;->queryPasspointIcon(JLjava/lang/String;)V
-Landroid/net/wifi/WifiManager;->registerSoftApCallback(Landroid/net/wifi/WifiManager$SoftApCallback;Landroid/os/Handler;)V
-Landroid/net/wifi/WifiManager;->removeListener(I)Ljava/lang/Object;
-Landroid/net/wifi/WifiManager;->restoreBackupData([B)V
-Landroid/net/wifi/WifiManager;->restoreSupplicantBackupData([B[B)V
-Landroid/net/wifi/WifiManager;->retrieveBackupData()[B
-Landroid/net/wifi/WifiManager;->RSSI_PKTCNT_FETCH:I
-Landroid/net/wifi/WifiManager;->RSSI_PKTCNT_FETCH_FAILED:I
-Landroid/net/wifi/WifiManager;->RSSI_PKTCNT_FETCH_SUCCEEDED:I
-Landroid/net/wifi/WifiManager;->SAP_START_FAILURE_GENERAL:I
-Landroid/net/wifi/WifiManager;->SAP_START_FAILURE_NO_CHANNEL:I
-Landroid/net/wifi/WifiManager;->SAVE_NETWORK:I
-Landroid/net/wifi/WifiManager;->SAVE_NETWORK_FAILED:I
-Landroid/net/wifi/WifiManager;->SAVE_NETWORK_SUCCEEDED:I
-Landroid/net/wifi/WifiManager;->setCountryCode(Ljava/lang/String;)V
-Landroid/net/wifi/WifiManager;->setEnableAutoJoinWhenAssociated(Z)Z
-Landroid/net/wifi/WifiManager;->sServiceHandlerDispatchLock:Ljava/lang/Object;
-Landroid/net/wifi/WifiManager;->startSoftAp(Landroid/net/wifi/WifiConfiguration;)Z
-Landroid/net/wifi/WifiManager;->startSubscriptionProvisioning(Landroid/net/wifi/hotspot2/OsuProvider;Landroid/net/wifi/hotspot2/ProvisioningCallback;Landroid/os/Handler;)V
-Landroid/net/wifi/WifiManager;->START_WPS:I
-Landroid/net/wifi/WifiManager;->START_WPS_SUCCEEDED:I
-Landroid/net/wifi/WifiManager;->stopLocalOnlyHotspot()V
-Landroid/net/wifi/WifiManager;->stopSoftAp()Z
-Landroid/net/wifi/WifiManager;->TAG:Ljava/lang/String;
-Landroid/net/wifi/WifiManager;->unregisterLocalOnlyHotspotObserver()V
-Landroid/net/wifi/WifiManager;->unregisterSoftApCallback(Landroid/net/wifi/WifiManager$SoftApCallback;)V
-Landroid/net/wifi/WifiManager;->updateInterfaceIpState(Ljava/lang/String;I)V
-Landroid/net/wifi/WifiManager;->watchLocalOnlyHotspot(Landroid/net/wifi/WifiManager$LocalOnlyHotspotObserver;Landroid/os/Handler;)V
-Landroid/net/wifi/WifiManager;->WIFI_FEATURE_ADDITIONAL_STA:I
-Landroid/net/wifi/WifiManager;->WIFI_FEATURE_AP_STA:I
-Landroid/net/wifi/WifiManager;->WIFI_FEATURE_AWARE:I
-Landroid/net/wifi/WifiManager;->WIFI_FEATURE_BATCH_SCAN:I
-Landroid/net/wifi/WifiManager;->WIFI_FEATURE_CONFIG_NDO:I
-Landroid/net/wifi/WifiManager;->WIFI_FEATURE_CONTROL_ROAMING:I
-Landroid/net/wifi/WifiManager;->WIFI_FEATURE_D2AP_RTT:I
-Landroid/net/wifi/WifiManager;->WIFI_FEATURE_D2D_RTT:I
-Landroid/net/wifi/WifiManager;->WIFI_FEATURE_EPR:I
-Landroid/net/wifi/WifiManager;->WIFI_FEATURE_HAL_EPNO:I
-Landroid/net/wifi/WifiManager;->WIFI_FEATURE_IE_WHITELIST:I
-Landroid/net/wifi/WifiManager;->WIFI_FEATURE_INFRA:I
-Landroid/net/wifi/WifiManager;->WIFI_FEATURE_INFRA_5G:I
-Landroid/net/wifi/WifiManager;->WIFI_FEATURE_LINK_LAYER_STATS:I
-Landroid/net/wifi/WifiManager;->WIFI_FEATURE_LOGGER:I
-Landroid/net/wifi/WifiManager;->WIFI_FEATURE_MKEEP_ALIVE:I
-Landroid/net/wifi/WifiManager;->WIFI_FEATURE_MOBILE_HOTSPOT:I
-Landroid/net/wifi/WifiManager;->WIFI_FEATURE_P2P:I
-Landroid/net/wifi/WifiManager;->WIFI_FEATURE_PASSPOINT:I
-Landroid/net/wifi/WifiManager;->WIFI_FEATURE_PNO:I
-Landroid/net/wifi/WifiManager;->WIFI_FEATURE_RSSI_MONITOR:I
-Landroid/net/wifi/WifiManager;->WIFI_FEATURE_SCANNER:I
-Landroid/net/wifi/WifiManager;->WIFI_FEATURE_SCAN_RAND:I
-Landroid/net/wifi/WifiManager;->WIFI_FEATURE_TDLS:I
-Landroid/net/wifi/WifiManager;->WIFI_FEATURE_TDLS_OFFCHANNEL:I
-Landroid/net/wifi/WifiManager;->WIFI_FEATURE_TRANSMIT_POWER:I
-Landroid/net/wifi/WifiManager;->WIFI_FEATURE_TX_POWER_LIMIT:I
-Landroid/net/wifi/WifiManager;->WIFI_MODE_NO_LOCKS_HELD:I
-Landroid/net/wifi/WifiManager;->WIFI_SCAN_AVAILABLE:Ljava/lang/String;
-Landroid/net/wifi/WifiManager;->WPS_COMPLETED:I
-Landroid/net/wifi/WifiManager;->WPS_FAILED:I
-Landroid/net/wifi/WifiNetworkConnectionStatistics;->TAG:Ljava/lang/String;
Landroid/net/wifi/WifiNetworkScoreCache$CacheListener;-><init>(Landroid/os/Handler;)V
Landroid/net/wifi/WifiNetworkScoreCache$CacheListener;->mHandler:Landroid/os/Handler;
Landroid/net/wifi/WifiNetworkScoreCache$CacheListener;->networkCacheUpdated(Ljava/util/List;)V
@@ -40268,116 +37107,6 @@
Landroid/net/wifi/WifiNetworkScoreCache;->TAG:Ljava/lang/String;
Landroid/net/wifi/WifiNetworkScoreCache;->unregisterListener()V
Landroid/net/wifi/WifiNetworkScoreCache;->updateScores(Ljava/util/List;)V
-Landroid/net/wifi/WifiScanner$ChannelSpec;->dwellTimeMS:I
-Landroid/net/wifi/WifiScanner$ChannelSpec;->passive:Z
-Landroid/net/wifi/WifiScanner$HotlistSettings;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/net/wifi/WifiScanner$OperationResult;-><init>(ILjava/lang/String;)V
-Landroid/net/wifi/WifiScanner$OperationResult;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/net/wifi/WifiScanner$OperationResult;->description:Ljava/lang/String;
-Landroid/net/wifi/WifiScanner$OperationResult;->reason:I
-Landroid/net/wifi/WifiScanner$ParcelableScanData;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/net/wifi/WifiScanner$ParcelableScanResults;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/net/wifi/WifiScanner$PnoScanListener;->onPnoNetworkFound([Landroid/net/wifi/ScanResult;)V
-Landroid/net/wifi/WifiScanner$PnoSettings$PnoNetwork;-><init>(Ljava/lang/String;)V
-Landroid/net/wifi/WifiScanner$PnoSettings$PnoNetwork;->authBitField:B
-Landroid/net/wifi/WifiScanner$PnoSettings$PnoNetwork;->AUTH_CODE_EAPOL:B
-Landroid/net/wifi/WifiScanner$PnoSettings$PnoNetwork;->AUTH_CODE_OPEN:B
-Landroid/net/wifi/WifiScanner$PnoSettings$PnoNetwork;->AUTH_CODE_PSK:B
-Landroid/net/wifi/WifiScanner$PnoSettings$PnoNetwork;->flags:B
-Landroid/net/wifi/WifiScanner$PnoSettings$PnoNetwork;->FLAG_A_BAND:B
-Landroid/net/wifi/WifiScanner$PnoSettings$PnoNetwork;->FLAG_DIRECTED_SCAN:B
-Landroid/net/wifi/WifiScanner$PnoSettings$PnoNetwork;->FLAG_G_BAND:B
-Landroid/net/wifi/WifiScanner$PnoSettings$PnoNetwork;->FLAG_SAME_NETWORK:B
-Landroid/net/wifi/WifiScanner$PnoSettings$PnoNetwork;->FLAG_STRICT_MATCH:B
-Landroid/net/wifi/WifiScanner$PnoSettings$PnoNetwork;->ssid:Ljava/lang/String;
-Landroid/net/wifi/WifiScanner$PnoSettings;-><init>()V
-Landroid/net/wifi/WifiScanner$PnoSettings;->band5GHzBonus:I
-Landroid/net/wifi/WifiScanner$PnoSettings;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/net/wifi/WifiScanner$PnoSettings;->currentConnectionBonus:I
-Landroid/net/wifi/WifiScanner$PnoSettings;->initialScoreMax:I
-Landroid/net/wifi/WifiScanner$PnoSettings;->isConnected:Z
-Landroid/net/wifi/WifiScanner$PnoSettings;->min24GHzRssi:I
-Landroid/net/wifi/WifiScanner$PnoSettings;->min5GHzRssi:I
-Landroid/net/wifi/WifiScanner$PnoSettings;->networkList:[Landroid/net/wifi/WifiScanner$PnoSettings$PnoNetwork;
-Landroid/net/wifi/WifiScanner$PnoSettings;->sameNetworkBonus:I
-Landroid/net/wifi/WifiScanner$PnoSettings;->secureBonus:I
-Landroid/net/wifi/WifiScanner$ScanData;-><init>()V
-Landroid/net/wifi/WifiScanner$ScanData;-><init>(IIIZ[Landroid/net/wifi/ScanResult;)V
-Landroid/net/wifi/WifiScanner$ScanData;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/net/wifi/WifiScanner$ScanData;->getBucketsScanned()I
-Landroid/net/wifi/WifiScanner$ScanData;->isAllChannelsScanned()Z
-Landroid/net/wifi/WifiScanner$ScanData;->mAllChannelsScanned:Z
-Landroid/net/wifi/WifiScanner$ScanData;->mBucketsScanned:I
-Landroid/net/wifi/WifiScanner$ScanData;->mFlags:I
-Landroid/net/wifi/WifiScanner$ScanData;->mId:I
-Landroid/net/wifi/WifiScanner$ScanData;->mResults:[Landroid/net/wifi/ScanResult;
-Landroid/net/wifi/WifiScanner$ScanSettings$HiddenNetwork;-><init>(Ljava/lang/String;)V
-Landroid/net/wifi/WifiScanner$ScanSettings$HiddenNetwork;->ssid:Ljava/lang/String;
-Landroid/net/wifi/WifiScanner$ScanSettings;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/net/wifi/WifiScanner$ScanSettings;->hiddenNetworks:[Landroid/net/wifi/WifiScanner$ScanSettings$HiddenNetwork;
-Landroid/net/wifi/WifiScanner$ScanSettings;->isPnoScan:Z
-Landroid/net/wifi/WifiScanner$ScanSettings;->type:I
-Landroid/net/wifi/WifiScanner$WifiChangeSettings;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/net/wifi/WifiScanner;-><init>(Landroid/content/Context;Landroid/net/wifi/IWifiScanner;Landroid/os/Looper;)V
-Landroid/net/wifi/WifiScanner;->addListener(Landroid/net/wifi/WifiScanner$ActionListener;)I
-Landroid/net/wifi/WifiScanner;->BASE:I
-Landroid/net/wifi/WifiScanner;->CMD_DEREGISTER_SCAN_LISTENER:I
-Landroid/net/wifi/WifiScanner;->CMD_FULL_SCAN_RESULT:I
-Landroid/net/wifi/WifiScanner;->CMD_GET_SCAN_RESULTS:I
-Landroid/net/wifi/WifiScanner;->CMD_GET_SINGLE_SCAN_RESULTS:I
-Landroid/net/wifi/WifiScanner;->CMD_OP_FAILED:I
-Landroid/net/wifi/WifiScanner;->CMD_OP_SUCCEEDED:I
-Landroid/net/wifi/WifiScanner;->CMD_PNO_NETWORK_FOUND:I
-Landroid/net/wifi/WifiScanner;->CMD_REGISTER_SCAN_LISTENER:I
-Landroid/net/wifi/WifiScanner;->CMD_SCAN_RESULT:I
-Landroid/net/wifi/WifiScanner;->CMD_SINGLE_SCAN_COMPLETED:I
-Landroid/net/wifi/WifiScanner;->CMD_START_BACKGROUND_SCAN:I
-Landroid/net/wifi/WifiScanner;->CMD_START_PNO_SCAN:I
-Landroid/net/wifi/WifiScanner;->CMD_START_SINGLE_SCAN:I
-Landroid/net/wifi/WifiScanner;->CMD_STOP_BACKGROUND_SCAN:I
-Landroid/net/wifi/WifiScanner;->CMD_STOP_PNO_SCAN:I
-Landroid/net/wifi/WifiScanner;->CMD_STOP_SINGLE_SCAN:I
-Landroid/net/wifi/WifiScanner;->DBG:Z
-Landroid/net/wifi/WifiScanner;->deregisterScanListener(Landroid/net/wifi/WifiScanner$ScanListener;)V
-Landroid/net/wifi/WifiScanner;->getAvailableChannels(I)Ljava/util/List;
-Landroid/net/wifi/WifiScanner;->getListener(I)Ljava/lang/Object;
-Landroid/net/wifi/WifiScanner;->getListenerKey(Ljava/lang/Object;)I
-Landroid/net/wifi/WifiScanner;->getSingleScanResults()Ljava/util/List;
-Landroid/net/wifi/WifiScanner;->GET_AVAILABLE_CHANNELS_EXTRA:Ljava/lang/String;
-Landroid/net/wifi/WifiScanner;->INVALID_KEY:I
-Landroid/net/wifi/WifiScanner;->mAsyncChannel:Lcom/android/internal/util/AsyncChannel;
-Landroid/net/wifi/WifiScanner;->mContext:Landroid/content/Context;
-Landroid/net/wifi/WifiScanner;->mInternalHandler:Landroid/os/Handler;
-Landroid/net/wifi/WifiScanner;->mListenerKey:I
-Landroid/net/wifi/WifiScanner;->mListenerMap:Landroid/util/SparseArray;
-Landroid/net/wifi/WifiScanner;->mListenerMapLock:Ljava/lang/Object;
-Landroid/net/wifi/WifiScanner;->mService:Landroid/net/wifi/IWifiScanner;
-Landroid/net/wifi/WifiScanner;->PNO_PARAMS_PNO_SETTINGS_KEY:Ljava/lang/String;
-Landroid/net/wifi/WifiScanner;->PNO_PARAMS_SCAN_SETTINGS_KEY:Ljava/lang/String;
-Landroid/net/wifi/WifiScanner;->putListener(Ljava/lang/Object;)I
-Landroid/net/wifi/WifiScanner;->registerScanListener(Landroid/net/wifi/WifiScanner$ScanListener;)V
-Landroid/net/wifi/WifiScanner;->removeListener(I)Ljava/lang/Object;
-Landroid/net/wifi/WifiScanner;->removeListener(Ljava/lang/Object;)I
-Landroid/net/wifi/WifiScanner;->SCAN_PARAMS_SCAN_SETTINGS_KEY:Ljava/lang/String;
-Landroid/net/wifi/WifiScanner;->SCAN_PARAMS_WORK_SOURCE_KEY:Ljava/lang/String;
-Landroid/net/wifi/WifiScanner;->startConnectedPnoScan(Landroid/net/wifi/WifiScanner$ScanSettings;Landroid/net/wifi/WifiScanner$PnoSettings;Landroid/net/wifi/WifiScanner$PnoScanListener;)V
-Landroid/net/wifi/WifiScanner;->startDisconnectedPnoScan(Landroid/net/wifi/WifiScanner$ScanSettings;Landroid/net/wifi/WifiScanner$PnoSettings;Landroid/net/wifi/WifiScanner$PnoScanListener;)V
-Landroid/net/wifi/WifiScanner;->startPnoScan(Landroid/net/wifi/WifiScanner$ScanSettings;Landroid/net/wifi/WifiScanner$PnoSettings;I)V
-Landroid/net/wifi/WifiScanner;->stopPnoScan(Landroid/net/wifi/WifiScanner$ScanListener;)V
-Landroid/net/wifi/WifiScanner;->TAG:Ljava/lang/String;
-Landroid/net/wifi/WifiScanner;->TYPE_HIGH_ACCURACY:I
-Landroid/net/wifi/WifiScanner;->TYPE_LOW_LATENCY:I
-Landroid/net/wifi/WifiScanner;->TYPE_LOW_POWER:I
-Landroid/net/wifi/WifiScanner;->validateChannel()V
-Landroid/net/wifi/WifiSsid;-><init>()V
-Landroid/net/wifi/WifiSsid;->convertToBytes(Ljava/lang/String;)V
-Landroid/net/wifi/WifiSsid;->createFromByteArray([B)Landroid/net/wifi/WifiSsid;
-Landroid/net/wifi/WifiSsid;->createFromHex(Ljava/lang/String;)Landroid/net/wifi/WifiSsid;
-Landroid/net/wifi/WifiSsid;->getHexString()Ljava/lang/String;
-Landroid/net/wifi/WifiSsid;->HEX_RADIX:I
-Landroid/net/wifi/WifiSsid;->isArrayAllZeroes([B)Z
-Landroid/net/wifi/WifiSsid;->isHidden()Z
-Landroid/net/wifi/WifiSsid;->TAG:Ljava/lang/String;
Landroid/net/wifi/WifiWakeReasonAndCounts;-><init>()V
Landroid/net/wifi/WifiWakeReasonAndCounts;->cmdEventWakeCntArray:[I
Landroid/net/wifi/WifiWakeReasonAndCounts;->CREATOR:Landroid/os/Parcelable$Creator;
@@ -43626,45 +40355,6 @@
Landroid/os/IServiceManager;->LIST_SERVICES_TRANSACTION:I
Landroid/os/IServiceManager;->setPermissionController(Landroid/os/IPermissionController;)V
Landroid/os/IServiceManager;->SET_PERMISSION_CONTROLLER_TRANSACTION:I
-Landroid/os/IStatsCompanionService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/os/IStatsCompanionService$Stub$Proxy;->cancelAlarmForSubscriberTriggering()V
-Landroid/os/IStatsCompanionService$Stub$Proxy;->cancelAnomalyAlarm()V
-Landroid/os/IStatsCompanionService$Stub$Proxy;->cancelPullingAlarm()V
-Landroid/os/IStatsCompanionService$Stub$Proxy;->getInterfaceDescriptor()Ljava/lang/String;
-Landroid/os/IStatsCompanionService$Stub$Proxy;->mRemote:Landroid/os/IBinder;
-Landroid/os/IStatsCompanionService$Stub$Proxy;->pullData(I)[Landroid/os/StatsLogEventWrapper;
-Landroid/os/IStatsCompanionService$Stub$Proxy;->sendDataBroadcast(Landroid/os/IBinder;J)V
-Landroid/os/IStatsCompanionService$Stub$Proxy;->sendSubscriberBroadcast(Landroid/os/IBinder;JJJJ[Ljava/lang/String;Landroid/os/StatsDimensionsValue;)V
-Landroid/os/IStatsCompanionService$Stub$Proxy;->setAlarmForSubscriberTriggering(J)V
-Landroid/os/IStatsCompanionService$Stub$Proxy;->setAnomalyAlarm(J)V
-Landroid/os/IStatsCompanionService$Stub$Proxy;->setPullingAlarm(J)V
-Landroid/os/IStatsCompanionService$Stub$Proxy;->statsdReady()V
-Landroid/os/IStatsCompanionService$Stub$Proxy;->triggerUidSnapshot()V
-Landroid/os/IStatsCompanionService$Stub;-><init>()V
-Landroid/os/IStatsCompanionService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/os/IStatsCompanionService;
-Landroid/os/IStatsCompanionService$Stub;->DESCRIPTOR:Ljava/lang/String;
-Landroid/os/IStatsCompanionService$Stub;->TRANSACTION_cancelAlarmForSubscriberTriggering:I
-Landroid/os/IStatsCompanionService$Stub;->TRANSACTION_cancelAnomalyAlarm:I
-Landroid/os/IStatsCompanionService$Stub;->TRANSACTION_cancelPullingAlarm:I
-Landroid/os/IStatsCompanionService$Stub;->TRANSACTION_pullData:I
-Landroid/os/IStatsCompanionService$Stub;->TRANSACTION_sendDataBroadcast:I
-Landroid/os/IStatsCompanionService$Stub;->TRANSACTION_sendSubscriberBroadcast:I
-Landroid/os/IStatsCompanionService$Stub;->TRANSACTION_setAlarmForSubscriberTriggering:I
-Landroid/os/IStatsCompanionService$Stub;->TRANSACTION_setAnomalyAlarm:I
-Landroid/os/IStatsCompanionService$Stub;->TRANSACTION_setPullingAlarm:I
-Landroid/os/IStatsCompanionService$Stub;->TRANSACTION_statsdReady:I
-Landroid/os/IStatsCompanionService$Stub;->TRANSACTION_triggerUidSnapshot:I
-Landroid/os/IStatsCompanionService;->cancelAlarmForSubscriberTriggering()V
-Landroid/os/IStatsCompanionService;->cancelAnomalyAlarm()V
-Landroid/os/IStatsCompanionService;->cancelPullingAlarm()V
-Landroid/os/IStatsCompanionService;->pullData(I)[Landroid/os/StatsLogEventWrapper;
-Landroid/os/IStatsCompanionService;->sendDataBroadcast(Landroid/os/IBinder;J)V
-Landroid/os/IStatsCompanionService;->sendSubscriberBroadcast(Landroid/os/IBinder;JJJJ[Ljava/lang/String;Landroid/os/StatsDimensionsValue;)V
-Landroid/os/IStatsCompanionService;->setAlarmForSubscriberTriggering(J)V
-Landroid/os/IStatsCompanionService;->setAnomalyAlarm(J)V
-Landroid/os/IStatsCompanionService;->setPullingAlarm(J)V
-Landroid/os/IStatsCompanionService;->statsdReady()V
-Landroid/os/IStatsCompanionService;->triggerUidSnapshot()V
Landroid/os/IStatsManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
Landroid/os/IStatsManager$Stub$Proxy;->addConfiguration(J[BLjava/lang/String;)V
Landroid/os/IStatsManager$Stub$Proxy;->getData(JLjava/lang/String;)[B
@@ -45217,13 +41907,6 @@
Landroid/os/SimpleClock;-><init>(Ljava/time/ZoneId;)V
Landroid/os/SimpleClock;->zone:Ljava/time/ZoneId;
Landroid/os/StatFs;->doStat(Ljava/lang/String;)Landroid/system/StructStatVfs;
-Landroid/os/StatsDimensionsValue;-><init>(Landroid/os/Parcel;)V
-Landroid/os/StatsDimensionsValue;->mField:I
-Landroid/os/StatsDimensionsValue;->mValue:Ljava/lang/Object;
-Landroid/os/StatsDimensionsValue;->mValueType:I
-Landroid/os/StatsDimensionsValue;->readValueFromParcel(ILandroid/os/Parcel;)Ljava/lang/Object;
-Landroid/os/StatsDimensionsValue;->TAG:Ljava/lang/String;
-Landroid/os/StatsDimensionsValue;->writeValueToParcel(ILjava/lang/Object;Landroid/os/Parcel;I)Z
Landroid/os/StatsLogEventWrapper;-><init>(JII)V
Landroid/os/StatsLogEventWrapper;-><init>(Landroid/os/Parcel;)V
Landroid/os/StatsLogEventWrapper;->CREATOR:Landroid/os/Parcelable$Creator;
@@ -48671,33 +45354,6 @@
Landroid/provider/FontsContract;->TAG:Ljava/lang/String;
Landroid/provider/FontsContract;->THREAD_RENEWAL_THRESHOLD_MS:I
Landroid/provider/LiveFolders;-><init>()V
-Landroid/provider/MediaStore$Audio$AudioColumns;->ALBUM_ARTIST:Ljava/lang/String;
-Landroid/provider/MediaStore$Audio$AudioColumns;->COMPILATION:Ljava/lang/String;
-Landroid/provider/MediaStore$Audio$AudioColumns;->GENRE:Ljava/lang/String;
-Landroid/provider/MediaStore$Audio$AudioColumns;->TITLE_RESOURCE_URI:Ljava/lang/String;
-Landroid/provider/MediaStore$Audio$Media;->EXTERNAL_PATHS:[Ljava/lang/String;
-Landroid/provider/MediaStore$Audio$Radio;-><init>()V
-Landroid/provider/MediaStore$Files;->getDirectoryUri(Ljava/lang/String;)Landroid/net/Uri;
-Landroid/provider/MediaStore$Images$Media;->StoreThumbnail(Landroid/content/ContentResolver;Landroid/graphics/Bitmap;JFFI)Landroid/graphics/Bitmap;
-Landroid/provider/MediaStore$InternalThumbnails;-><init>()V
-Landroid/provider/MediaStore$InternalThumbnails;->cancelThumbnailRequest(Landroid/content/ContentResolver;JLandroid/net/Uri;J)V
-Landroid/provider/MediaStore$InternalThumbnails;->DEFAULT_GROUP_ID:I
-Landroid/provider/MediaStore$InternalThumbnails;->FULL_SCREEN_KIND:I
-Landroid/provider/MediaStore$InternalThumbnails;->getMiniThumbFromFile(Landroid/database/Cursor;Landroid/net/Uri;Landroid/content/ContentResolver;Landroid/graphics/BitmapFactory$Options;)Landroid/graphics/Bitmap;
-Landroid/provider/MediaStore$InternalThumbnails;->getThumbnail(Landroid/content/ContentResolver;JJILandroid/graphics/BitmapFactory$Options;Landroid/net/Uri;Z)Landroid/graphics/Bitmap;
-Landroid/provider/MediaStore$InternalThumbnails;->MICRO_KIND:I
-Landroid/provider/MediaStore$InternalThumbnails;->MINI_KIND:I
-Landroid/provider/MediaStore$InternalThumbnails;->PROJECTION:[Ljava/lang/String;
-Landroid/provider/MediaStore$InternalThumbnails;->sThumbBuf:[B
-Landroid/provider/MediaStore$InternalThumbnails;->sThumbBufLock:Ljava/lang/Object;
-Landroid/provider/MediaStore$MediaColumns;->MEDIA_SCANNER_NEW_OBJECT_ID:Ljava/lang/String;
-Landroid/provider/MediaStore;->CONTENT_AUTHORITY_SLASH:Ljava/lang/String;
-Landroid/provider/MediaStore;->getDocumentUri(Landroid/content/ContentResolver;Ljava/lang/String;Ljava/util/List;)Landroid/net/Uri;
-Landroid/provider/MediaStore;->getFilePath(Landroid/content/ContentResolver;Landroid/net/Uri;)Ljava/lang/String;
-Landroid/provider/MediaStore;->PARAM_DELETE_DATA:Ljava/lang/String;
-Landroid/provider/MediaStore;->RETRANSLATE_CALL:Ljava/lang/String;
-Landroid/provider/MediaStore;->TAG:Ljava/lang/String;
-Landroid/provider/MediaStore;->UNHIDE_CALL:Ljava/lang/String;
Landroid/provider/MetadataReader;-><init>()V
Landroid/provider/MetadataReader;->DEFAULT_EXIF_TAGS:[Ljava/lang/String;
Landroid/provider/MetadataReader;->getExifData(Ljava/io/InputStream;[Ljava/lang/String;)Landroid/os/Bundle;
@@ -65005,412 +61661,6 @@
Landroid/util/StateSet;->VIEW_STATE_SELECTED:I
Landroid/util/StateSet;->VIEW_STATE_SETS:[[I
Landroid/util/StateSet;->VIEW_STATE_WINDOW_FOCUSED:I
-Landroid/util/StatsLog;-><init>()V
-Landroid/util/StatsLog;->DEBUG:Z
-Landroid/util/StatsLog;->getIStatsManagerLocked()Landroid/os/IStatsManager;
-Landroid/util/StatsLog;->sService:Landroid/os/IStatsManager;
-Landroid/util/StatsLog;->TAG:Ljava/lang/String;
-Landroid/util/StatsLogInternal;-><init>()V
-Landroid/util/StatsLogInternal;->ACTIVITY_FOREGROUND_STATE_CHANGED:I
-Landroid/util/StatsLogInternal;->ACTIVITY_FOREGROUND_STATE_CHANGED__STATE__BACKGROUND:I
-Landroid/util/StatsLogInternal;->ACTIVITY_FOREGROUND_STATE_CHANGED__STATE__FOREGROUND:I
-Landroid/util/StatsLogInternal;->ANOMALY_DETECTED:I
-Landroid/util/StatsLogInternal;->ANROCCURRED__FOREGROUND_STATE__BACKGROUND:I
-Landroid/util/StatsLogInternal;->ANROCCURRED__FOREGROUND_STATE__FOREGROUND:I
-Landroid/util/StatsLogInternal;->ANROCCURRED__FOREGROUND_STATE__UNKNOWN:I
-Landroid/util/StatsLogInternal;->ANROCCURRED__IS_INSTANT_APP__FALSE:I
-Landroid/util/StatsLogInternal;->ANROCCURRED__IS_INSTANT_APP__TRUE:I
-Landroid/util/StatsLogInternal;->ANROCCURRED__IS_INSTANT_APP__UNAVAILABLE:I
-Landroid/util/StatsLogInternal;->ANR_OCCURRED:I
-Landroid/util/StatsLogInternal;->APP_BREADCRUMB_REPORTED:I
-Landroid/util/StatsLogInternal;->APP_BREADCRUMB_REPORTED__STATE__START:I
-Landroid/util/StatsLogInternal;->APP_BREADCRUMB_REPORTED__STATE__STOP:I
-Landroid/util/StatsLogInternal;->APP_BREADCRUMB_REPORTED__STATE__UNKNOWN:I
-Landroid/util/StatsLogInternal;->APP_BREADCRUMB_REPORTED__STATE__UNSPECIFIED:I
-Landroid/util/StatsLogInternal;->APP_CRASH_OCCURRED:I
-Landroid/util/StatsLogInternal;->APP_CRASH_OCCURRED__FOREGROUND_STATE__BACKGROUND:I
-Landroid/util/StatsLogInternal;->APP_CRASH_OCCURRED__FOREGROUND_STATE__FOREGROUND:I
-Landroid/util/StatsLogInternal;->APP_CRASH_OCCURRED__FOREGROUND_STATE__UNKNOWN:I
-Landroid/util/StatsLogInternal;->APP_CRASH_OCCURRED__IS_INSTANT_APP__FALSE:I
-Landroid/util/StatsLogInternal;->APP_CRASH_OCCURRED__IS_INSTANT_APP__TRUE:I
-Landroid/util/StatsLogInternal;->APP_CRASH_OCCURRED__IS_INSTANT_APP__UNAVAILABLE:I
-Landroid/util/StatsLogInternal;->APP_DIED:I
-Landroid/util/StatsLogInternal;->APP_START_CANCELED:I
-Landroid/util/StatsLogInternal;->APP_START_CANCELED__TYPE__COLD:I
-Landroid/util/StatsLogInternal;->APP_START_CANCELED__TYPE__HOT:I
-Landroid/util/StatsLogInternal;->APP_START_CANCELED__TYPE__UNKNOWN:I
-Landroid/util/StatsLogInternal;->APP_START_CANCELED__TYPE__WARM:I
-Landroid/util/StatsLogInternal;->APP_START_FULLY_DRAWN:I
-Landroid/util/StatsLogInternal;->APP_START_FULLY_DRAWN__TYPE__UNKNOWN:I
-Landroid/util/StatsLogInternal;->APP_START_FULLY_DRAWN__TYPE__WITHOUT_BUNDLE:I
-Landroid/util/StatsLogInternal;->APP_START_FULLY_DRAWN__TYPE__WITH_BUNDLE:I
-Landroid/util/StatsLogInternal;->APP_START_MEMORY_STATE_CAPTURED:I
-Landroid/util/StatsLogInternal;->APP_START_OCCURRED:I
-Landroid/util/StatsLogInternal;->APP_START_OCCURRED__REASON__APP_TRANSITION_REASON_UNKNOWN:I
-Landroid/util/StatsLogInternal;->APP_START_OCCURRED__REASON__APP_TRANSITION_RECENTS_ANIM:I
-Landroid/util/StatsLogInternal;->APP_START_OCCURRED__REASON__APP_TRANSITION_SNAPSHOT:I
-Landroid/util/StatsLogInternal;->APP_START_OCCURRED__REASON__APP_TRANSITION_SPLASH_SCREEN:I
-Landroid/util/StatsLogInternal;->APP_START_OCCURRED__REASON__APP_TRANSITION_TIMEOUT:I
-Landroid/util/StatsLogInternal;->APP_START_OCCURRED__REASON__APP_TRANSITION_WINDOWS_DRAWN:I
-Landroid/util/StatsLogInternal;->APP_START_OCCURRED__TYPE__COLD:I
-Landroid/util/StatsLogInternal;->APP_START_OCCURRED__TYPE__HOT:I
-Landroid/util/StatsLogInternal;->APP_START_OCCURRED__TYPE__UNKNOWN:I
-Landroid/util/StatsLogInternal;->APP_START_OCCURRED__TYPE__WARM:I
-Landroid/util/StatsLogInternal;->AUDIO_STATE_CHANGED:I
-Landroid/util/StatsLogInternal;->AUDIO_STATE_CHANGED__STATE__OFF:I
-Landroid/util/StatsLogInternal;->AUDIO_STATE_CHANGED__STATE__ON:I
-Landroid/util/StatsLogInternal;->AUDIO_STATE_CHANGED__STATE__RESET:I
-Landroid/util/StatsLogInternal;->BATTERY_LEVEL_CHANGED:I
-Landroid/util/StatsLogInternal;->BATTERY_SAVER_MODE_STATE_CHANGED:I
-Landroid/util/StatsLogInternal;->BATTERY_SAVER_MODE_STATE_CHANGED__STATE__OFF:I
-Landroid/util/StatsLogInternal;->BATTERY_SAVER_MODE_STATE_CHANGED__STATE__ON:I
-Landroid/util/StatsLogInternal;->BLE_SCAN_RESULT_RECEIVED:I
-Landroid/util/StatsLogInternal;->BLE_SCAN_STATE_CHANGED:I
-Landroid/util/StatsLogInternal;->BLE_SCAN_STATE_CHANGED__STATE__OFF:I
-Landroid/util/StatsLogInternal;->BLE_SCAN_STATE_CHANGED__STATE__ON:I
-Landroid/util/StatsLogInternal;->BLE_SCAN_STATE_CHANGED__STATE__RESET:I
-Landroid/util/StatsLogInternal;->BLUETOOTH_ACTIVITY_INFO:I
-Landroid/util/StatsLogInternal;->BLUETOOTH_BYTES_TRANSFER:I
-Landroid/util/StatsLogInternal;->BLUETOOTH_CONNECTION_STATE_CHANGED:I
-Landroid/util/StatsLogInternal;->BLUETOOTH_CONNECTION_STATE_CHANGED__STATE__CONNECTION_STATE_CONNECTED:I
-Landroid/util/StatsLogInternal;->BLUETOOTH_CONNECTION_STATE_CHANGED__STATE__CONNECTION_STATE_CONNECTING:I
-Landroid/util/StatsLogInternal;->BLUETOOTH_CONNECTION_STATE_CHANGED__STATE__CONNECTION_STATE_DISCONNECTED:I
-Landroid/util/StatsLogInternal;->BLUETOOTH_CONNECTION_STATE_CHANGED__STATE__CONNECTION_STATE_DISCONNECTING:I
-Landroid/util/StatsLogInternal;->BLUETOOTH_ENABLED_STATE_CHANGED:I
-Landroid/util/StatsLogInternal;->BLUETOOTH_ENABLED_STATE_CHANGED__REASON__ENABLE_DISABLE_REASON_AIRPLANE_MODE:I
-Landroid/util/StatsLogInternal;->BLUETOOTH_ENABLED_STATE_CHANGED__REASON__ENABLE_DISABLE_REASON_APPLICATION_REQUEST:I
-Landroid/util/StatsLogInternal;->BLUETOOTH_ENABLED_STATE_CHANGED__REASON__ENABLE_DISABLE_REASON_CRASH:I
-Landroid/util/StatsLogInternal;->BLUETOOTH_ENABLED_STATE_CHANGED__REASON__ENABLE_DISABLE_REASON_DISALLOWED:I
-Landroid/util/StatsLogInternal;->BLUETOOTH_ENABLED_STATE_CHANGED__REASON__ENABLE_DISABLE_REASON_RESTARTED:I
-Landroid/util/StatsLogInternal;->BLUETOOTH_ENABLED_STATE_CHANGED__REASON__ENABLE_DISABLE_REASON_RESTORE_USER_SETTING:I
-Landroid/util/StatsLogInternal;->BLUETOOTH_ENABLED_STATE_CHANGED__REASON__ENABLE_DISABLE_REASON_START_ERROR:I
-Landroid/util/StatsLogInternal;->BLUETOOTH_ENABLED_STATE_CHANGED__REASON__ENABLE_DISABLE_REASON_SYSTEM_BOOT:I
-Landroid/util/StatsLogInternal;->BLUETOOTH_ENABLED_STATE_CHANGED__REASON__ENABLE_DISABLE_REASON_UNSPECIFIED:I
-Landroid/util/StatsLogInternal;->BLUETOOTH_ENABLED_STATE_CHANGED__REASON__ENABLE_DISABLE_REASON_USER_SWITCH:I
-Landroid/util/StatsLogInternal;->BLUETOOTH_ENABLED_STATE_CHANGED__STATE__DISABLED:I
-Landroid/util/StatsLogInternal;->BLUETOOTH_ENABLED_STATE_CHANGED__STATE__ENABLED:I
-Landroid/util/StatsLogInternal;->BLUETOOTH_ENABLED_STATE_CHANGED__STATE__UNKNOWN:I
-Landroid/util/StatsLogInternal;->BOOT_SEQUENCE_REPORTED:I
-Landroid/util/StatsLogInternal;->CALL_STATE_CHANGED:I
-Landroid/util/StatsLogInternal;->CALL_STATE_CHANGED__CALL_STATE__ABORTED:I
-Landroid/util/StatsLogInternal;->CALL_STATE_CHANGED__CALL_STATE__ACTIVE:I
-Landroid/util/StatsLogInternal;->CALL_STATE_CHANGED__CALL_STATE__CONNECTING:I
-Landroid/util/StatsLogInternal;->CALL_STATE_CHANGED__CALL_STATE__DIALING:I
-Landroid/util/StatsLogInternal;->CALL_STATE_CHANGED__CALL_STATE__DISCONNECTED:I
-Landroid/util/StatsLogInternal;->CALL_STATE_CHANGED__CALL_STATE__DISCONNECTING:I
-Landroid/util/StatsLogInternal;->CALL_STATE_CHANGED__CALL_STATE__NEW:I
-Landroid/util/StatsLogInternal;->CALL_STATE_CHANGED__CALL_STATE__ON_HOLD:I
-Landroid/util/StatsLogInternal;->CALL_STATE_CHANGED__CALL_STATE__PULLING:I
-Landroid/util/StatsLogInternal;->CALL_STATE_CHANGED__CALL_STATE__RINGING:I
-Landroid/util/StatsLogInternal;->CALL_STATE_CHANGED__CALL_STATE__SELECT_PHONE_ACCOUNT:I
-Landroid/util/StatsLogInternal;->CALL_STATE_CHANGED__DISCONNECT_CAUSE__ANSWERED_ELSEWHERE:I
-Landroid/util/StatsLogInternal;->CALL_STATE_CHANGED__DISCONNECT_CAUSE__BUSY:I
-Landroid/util/StatsLogInternal;->CALL_STATE_CHANGED__DISCONNECT_CAUSE__CALL_PULLED:I
-Landroid/util/StatsLogInternal;->CALL_STATE_CHANGED__DISCONNECT_CAUSE__CANCELED:I
-Landroid/util/StatsLogInternal;->CALL_STATE_CHANGED__DISCONNECT_CAUSE__CONNECTION_MANAGER_NOT_SUPPORTED:I
-Landroid/util/StatsLogInternal;->CALL_STATE_CHANGED__DISCONNECT_CAUSE__ERROR:I
-Landroid/util/StatsLogInternal;->CALL_STATE_CHANGED__DISCONNECT_CAUSE__LOCAL:I
-Landroid/util/StatsLogInternal;->CALL_STATE_CHANGED__DISCONNECT_CAUSE__MISSED:I
-Landroid/util/StatsLogInternal;->CALL_STATE_CHANGED__DISCONNECT_CAUSE__OTHER:I
-Landroid/util/StatsLogInternal;->CALL_STATE_CHANGED__DISCONNECT_CAUSE__REJECTED:I
-Landroid/util/StatsLogInternal;->CALL_STATE_CHANGED__DISCONNECT_CAUSE__REMOTE:I
-Landroid/util/StatsLogInternal;->CALL_STATE_CHANGED__DISCONNECT_CAUSE__RESTRICTED:I
-Landroid/util/StatsLogInternal;->CALL_STATE_CHANGED__DISCONNECT_CAUSE__UNKNOWN:I
-Landroid/util/StatsLogInternal;->CAMERA_STATE_CHANGED:I
-Landroid/util/StatsLogInternal;->CAMERA_STATE_CHANGED__STATE__OFF:I
-Landroid/util/StatsLogInternal;->CAMERA_STATE_CHANGED__STATE__ON:I
-Landroid/util/StatsLogInternal;->CAMERA_STATE_CHANGED__STATE__RESET:I
-Landroid/util/StatsLogInternal;->CHARGE_CYCLES_REPORTED:I
-Landroid/util/StatsLogInternal;->CHARGING_STATE_CHANGED:I
-Landroid/util/StatsLogInternal;->CHARGING_STATE_CHANGED__STATE__BATTERY_STATUS_CHARGING:I
-Landroid/util/StatsLogInternal;->CHARGING_STATE_CHANGED__STATE__BATTERY_STATUS_DISCHARGING:I
-Landroid/util/StatsLogInternal;->CHARGING_STATE_CHANGED__STATE__BATTERY_STATUS_FULL:I
-Landroid/util/StatsLogInternal;->CHARGING_STATE_CHANGED__STATE__BATTERY_STATUS_INVALID:I
-Landroid/util/StatsLogInternal;->CHARGING_STATE_CHANGED__STATE__BATTERY_STATUS_NOT_CHARGING:I
-Landroid/util/StatsLogInternal;->CHARGING_STATE_CHANGED__STATE__BATTERY_STATUS_UNKNOWN:I
-Landroid/util/StatsLogInternal;->CPU_ACTIVE_TIME:I
-Landroid/util/StatsLogInternal;->CPU_CLUSTER_TIME:I
-Landroid/util/StatsLogInternal;->CPU_TIME_PER_FREQ:I
-Landroid/util/StatsLogInternal;->CPU_TIME_PER_UID:I
-Landroid/util/StatsLogInternal;->CPU_TIME_PER_UID_FREQ:I
-Landroid/util/StatsLogInternal;->DAVEY_OCCURRED:I
-Landroid/util/StatsLogInternal;->DEVICE_IDLE_MODE_STATE_CHANGED:I
-Landroid/util/StatsLogInternal;->DEVICE_IDLE_MODE_STATE_CHANGED__STATE__DEVICE_IDLE_MODE_DEEP:I
-Landroid/util/StatsLogInternal;->DEVICE_IDLE_MODE_STATE_CHANGED__STATE__DEVICE_IDLE_MODE_LIGHT:I
-Landroid/util/StatsLogInternal;->DEVICE_IDLE_MODE_STATE_CHANGED__STATE__DEVICE_IDLE_MODE_OFF:I
-Landroid/util/StatsLogInternal;->DEVICE_IDLING_MODE_STATE_CHANGED:I
-Landroid/util/StatsLogInternal;->DEVICE_IDLING_MODE_STATE_CHANGED__STATE__DEVICE_IDLE_MODE_DEEP:I
-Landroid/util/StatsLogInternal;->DEVICE_IDLING_MODE_STATE_CHANGED__STATE__DEVICE_IDLE_MODE_LIGHT:I
-Landroid/util/StatsLogInternal;->DEVICE_IDLING_MODE_STATE_CHANGED__STATE__DEVICE_IDLE_MODE_OFF:I
-Landroid/util/StatsLogInternal;->DISK_SPACE:I
-Landroid/util/StatsLogInternal;->FLASHLIGHT_STATE_CHANGED:I
-Landroid/util/StatsLogInternal;->FLASHLIGHT_STATE_CHANGED__STATE__OFF:I
-Landroid/util/StatsLogInternal;->FLASHLIGHT_STATE_CHANGED__STATE__ON:I
-Landroid/util/StatsLogInternal;->FLASHLIGHT_STATE_CHANGED__STATE__RESET:I
-Landroid/util/StatsLogInternal;->FOREGROUND_SERVICE_STATE_CHANGED:I
-Landroid/util/StatsLogInternal;->FOREGROUND_SERVICE_STATE_CHANGED__STATE__ENTER:I
-Landroid/util/StatsLogInternal;->FOREGROUND_SERVICE_STATE_CHANGED__STATE__EXIT:I
-Landroid/util/StatsLogInternal;->FULL_BATTERY_CAPACITY:I
-Landroid/util/StatsLogInternal;->GPS_SCAN_STATE_CHANGED:I
-Landroid/util/StatsLogInternal;->GPS_SCAN_STATE_CHANGED__STATE__OFF:I
-Landroid/util/StatsLogInternal;->GPS_SCAN_STATE_CHANGED__STATE__ON:I
-Landroid/util/StatsLogInternal;->HARDWARE_FAILED:I
-Landroid/util/StatsLogInternal;->HARDWARE_FAILED__HARDWARE_TYPE__HARDWARE_FAILED_CODEC:I
-Landroid/util/StatsLogInternal;->HARDWARE_FAILED__HARDWARE_TYPE__HARDWARE_FAILED_FINGERPRINT:I
-Landroid/util/StatsLogInternal;->HARDWARE_FAILED__HARDWARE_TYPE__HARDWARE_FAILED_MICROPHONE:I
-Landroid/util/StatsLogInternal;->HARDWARE_FAILED__HARDWARE_TYPE__HARDWARE_FAILED_SPEAKER:I
-Landroid/util/StatsLogInternal;->HARDWARE_FAILED__HARDWARE_TYPE__HARDWARE_FAILED_UNKNOWN:I
-Landroid/util/StatsLogInternal;->ISOLATED_UID_CHANGED:I
-Landroid/util/StatsLogInternal;->ISOLATED_UID_CHANGED__EVENT__CREATED:I
-Landroid/util/StatsLogInternal;->ISOLATED_UID_CHANGED__EVENT__REMOVED:I
-Landroid/util/StatsLogInternal;->KERNEL_WAKELOCK:I
-Landroid/util/StatsLogInternal;->KERNEL_WAKEUP_REPORTED:I
-Landroid/util/StatsLogInternal;->KEYGUARD_BOUNCER_PASSWORD_ENTERED:I
-Landroid/util/StatsLogInternal;->KEYGUARD_BOUNCER_PASSWORD_ENTERED__RESULT__FAILURE:I
-Landroid/util/StatsLogInternal;->KEYGUARD_BOUNCER_PASSWORD_ENTERED__RESULT__SUCCESS:I
-Landroid/util/StatsLogInternal;->KEYGUARD_BOUNCER_PASSWORD_ENTERED__RESULT__UNKNOWN:I
-Landroid/util/StatsLogInternal;->KEYGUARD_BOUNCER_STATE_CHANGED:I
-Landroid/util/StatsLogInternal;->KEYGUARD_BOUNCER_STATE_CHANGED__STATE__HIDDEN:I
-Landroid/util/StatsLogInternal;->KEYGUARD_BOUNCER_STATE_CHANGED__STATE__SHOWN:I
-Landroid/util/StatsLogInternal;->KEYGUARD_BOUNCER_STATE_CHANGED__STATE__UNKNOWN:I
-Landroid/util/StatsLogInternal;->KEYGUARD_STATE_CHANGED:I
-Landroid/util/StatsLogInternal;->KEYGUARD_STATE_CHANGED__STATE__HIDDEN:I
-Landroid/util/StatsLogInternal;->KEYGUARD_STATE_CHANGED__STATE__OCCLUDED:I
-Landroid/util/StatsLogInternal;->KEYGUARD_STATE_CHANGED__STATE__SHOWN:I
-Landroid/util/StatsLogInternal;->KEYGUARD_STATE_CHANGED__STATE__UNKNOWN:I
-Landroid/util/StatsLogInternal;->LMK_KILL_OCCURRED:I
-Landroid/util/StatsLogInternal;->LMK_STATE_CHANGED:I
-Landroid/util/StatsLogInternal;->LMK_STATE_CHANGED__STATE__START:I
-Landroid/util/StatsLogInternal;->LMK_STATE_CHANGED__STATE__STOP:I
-Landroid/util/StatsLogInternal;->LMK_STATE_CHANGED__STATE__UNKNOWN:I
-Landroid/util/StatsLogInternal;->LONG_PARTIAL_WAKELOCK_STATE_CHANGED:I
-Landroid/util/StatsLogInternal;->LONG_PARTIAL_WAKELOCK_STATE_CHANGED__STATE__OFF:I
-Landroid/util/StatsLogInternal;->LONG_PARTIAL_WAKELOCK_STATE_CHANGED__STATE__ON:I
-Landroid/util/StatsLogInternal;->LOW_MEM_REPORTED:I
-Landroid/util/StatsLogInternal;->MEDIA_CODEC_STATE_CHANGED:I
-Landroid/util/StatsLogInternal;->MEDIA_CODEC_STATE_CHANGED__STATE__OFF:I
-Landroid/util/StatsLogInternal;->MEDIA_CODEC_STATE_CHANGED__STATE__ON:I
-Landroid/util/StatsLogInternal;->MEDIA_CODEC_STATE_CHANGED__STATE__RESET:I
-Landroid/util/StatsLogInternal;->MOBILE_BYTES_TRANSFER:I
-Landroid/util/StatsLogInternal;->MOBILE_BYTES_TRANSFER_BY_FG_BG:I
-Landroid/util/StatsLogInternal;->MOBILE_CONNECTION_STATE_CHANGED:I
-Landroid/util/StatsLogInternal;->MOBILE_CONNECTION_STATE_CHANGED__STATE__ACTIVATING:I
-Landroid/util/StatsLogInternal;->MOBILE_CONNECTION_STATE_CHANGED__STATE__ACTIVE:I
-Landroid/util/StatsLogInternal;->MOBILE_CONNECTION_STATE_CHANGED__STATE__DISCONNECTING:I
-Landroid/util/StatsLogInternal;->MOBILE_CONNECTION_STATE_CHANGED__STATE__DISCONNECTION_ERROR_CREATING_CONNECTION:I
-Landroid/util/StatsLogInternal;->MOBILE_CONNECTION_STATE_CHANGED__STATE__INACTIVE:I
-Landroid/util/StatsLogInternal;->MOBILE_CONNECTION_STATE_CHANGED__STATE__UNKNOWN:I
-Landroid/util/StatsLogInternal;->MOBILE_RADIO_POWER_STATE_CHANGED:I
-Landroid/util/StatsLogInternal;->MOBILE_RADIO_POWER_STATE_CHANGED__STATE__DATA_CONNECTION_POWER_STATE_HIGH:I
-Landroid/util/StatsLogInternal;->MOBILE_RADIO_POWER_STATE_CHANGED__STATE__DATA_CONNECTION_POWER_STATE_LOW:I
-Landroid/util/StatsLogInternal;->MOBILE_RADIO_POWER_STATE_CHANGED__STATE__DATA_CONNECTION_POWER_STATE_MEDIUM:I
-Landroid/util/StatsLogInternal;->MOBILE_RADIO_POWER_STATE_CHANGED__STATE__DATA_CONNECTION_POWER_STATE_UNKNOWN:I
-Landroid/util/StatsLogInternal;->MOBILE_RADIO_TECHNOLOGY_CHANGED:I
-Landroid/util/StatsLogInternal;->MOBILE_RADIO_TECHNOLOGY_CHANGED__STATE__NETWORK_TYPE_1XRTT:I
-Landroid/util/StatsLogInternal;->MOBILE_RADIO_TECHNOLOGY_CHANGED__STATE__NETWORK_TYPE_CDMA:I
-Landroid/util/StatsLogInternal;->MOBILE_RADIO_TECHNOLOGY_CHANGED__STATE__NETWORK_TYPE_EDGE:I
-Landroid/util/StatsLogInternal;->MOBILE_RADIO_TECHNOLOGY_CHANGED__STATE__NETWORK_TYPE_EHRPD:I
-Landroid/util/StatsLogInternal;->MOBILE_RADIO_TECHNOLOGY_CHANGED__STATE__NETWORK_TYPE_EVDO_0:I
-Landroid/util/StatsLogInternal;->MOBILE_RADIO_TECHNOLOGY_CHANGED__STATE__NETWORK_TYPE_EVDO_A:I
-Landroid/util/StatsLogInternal;->MOBILE_RADIO_TECHNOLOGY_CHANGED__STATE__NETWORK_TYPE_EVDO_B:I
-Landroid/util/StatsLogInternal;->MOBILE_RADIO_TECHNOLOGY_CHANGED__STATE__NETWORK_TYPE_GPRS:I
-Landroid/util/StatsLogInternal;->MOBILE_RADIO_TECHNOLOGY_CHANGED__STATE__NETWORK_TYPE_GSM:I
-Landroid/util/StatsLogInternal;->MOBILE_RADIO_TECHNOLOGY_CHANGED__STATE__NETWORK_TYPE_HSDPA:I
-Landroid/util/StatsLogInternal;->MOBILE_RADIO_TECHNOLOGY_CHANGED__STATE__NETWORK_TYPE_HSPA:I
-Landroid/util/StatsLogInternal;->MOBILE_RADIO_TECHNOLOGY_CHANGED__STATE__NETWORK_TYPE_HSPAP:I
-Landroid/util/StatsLogInternal;->MOBILE_RADIO_TECHNOLOGY_CHANGED__STATE__NETWORK_TYPE_HSUPA:I
-Landroid/util/StatsLogInternal;->MOBILE_RADIO_TECHNOLOGY_CHANGED__STATE__NETWORK_TYPE_IDEN:I
-Landroid/util/StatsLogInternal;->MOBILE_RADIO_TECHNOLOGY_CHANGED__STATE__NETWORK_TYPE_IWLAN:I
-Landroid/util/StatsLogInternal;->MOBILE_RADIO_TECHNOLOGY_CHANGED__STATE__NETWORK_TYPE_LTE:I
-Landroid/util/StatsLogInternal;->MOBILE_RADIO_TECHNOLOGY_CHANGED__STATE__NETWORK_TYPE_LTE_CA:I
-Landroid/util/StatsLogInternal;->MOBILE_RADIO_TECHNOLOGY_CHANGED__STATE__NETWORK_TYPE_TD_SCDMA:I
-Landroid/util/StatsLogInternal;->MOBILE_RADIO_TECHNOLOGY_CHANGED__STATE__NETWORK_TYPE_UMTS:I
-Landroid/util/StatsLogInternal;->MOBILE_RADIO_TECHNOLOGY_CHANGED__STATE__NETWORK_TYPE_UNKNOWN:I
-Landroid/util/StatsLogInternal;->MODEM_ACTIVITY_INFO:I
-Landroid/util/StatsLogInternal;->OVERLAY_STATE_CHANGED:I
-Landroid/util/StatsLogInternal;->OVERLAY_STATE_CHANGED__STATE__ENTERED:I
-Landroid/util/StatsLogInternal;->OVERLAY_STATE_CHANGED__STATE__EXITED:I
-Landroid/util/StatsLogInternal;->PACKET_WAKEUP_OCCURRED:I
-Landroid/util/StatsLogInternal;->PHONE_SIGNAL_STRENGTH_CHANGED:I
-Landroid/util/StatsLogInternal;->PHONE_SIGNAL_STRENGTH_CHANGED__SIGNAL_STRENGTH__SIGNAL_STRENGTH_GOOD:I
-Landroid/util/StatsLogInternal;->PHONE_SIGNAL_STRENGTH_CHANGED__SIGNAL_STRENGTH__SIGNAL_STRENGTH_GREAT:I
-Landroid/util/StatsLogInternal;->PHONE_SIGNAL_STRENGTH_CHANGED__SIGNAL_STRENGTH__SIGNAL_STRENGTH_MODERATE:I
-Landroid/util/StatsLogInternal;->PHONE_SIGNAL_STRENGTH_CHANGED__SIGNAL_STRENGTH__SIGNAL_STRENGTH_NONE_OR_UNKNOWN:I
-Landroid/util/StatsLogInternal;->PHONE_SIGNAL_STRENGTH_CHANGED__SIGNAL_STRENGTH__SIGNAL_STRENGTH_POOR:I
-Landroid/util/StatsLogInternal;->PHYSICAL_DROP_DETECTED:I
-Landroid/util/StatsLogInternal;->PICTURE_IN_PICTURE_STATE_CHANGED:I
-Landroid/util/StatsLogInternal;->PICTURE_IN_PICTURE_STATE_CHANGED__STATE__DISMISSED:I
-Landroid/util/StatsLogInternal;->PICTURE_IN_PICTURE_STATE_CHANGED__STATE__ENTERED:I
-Landroid/util/StatsLogInternal;->PICTURE_IN_PICTURE_STATE_CHANGED__STATE__EXPANDED_TO_FULL_SCREEN:I
-Landroid/util/StatsLogInternal;->PICTURE_IN_PICTURE_STATE_CHANGED__STATE__MINIMIZED:I
-Landroid/util/StatsLogInternal;->PLUGGED_STATE_CHANGED:I
-Landroid/util/StatsLogInternal;->PLUGGED_STATE_CHANGED__STATE__BATTERY_PLUGGED_AC:I
-Landroid/util/StatsLogInternal;->PLUGGED_STATE_CHANGED__STATE__BATTERY_PLUGGED_NONE:I
-Landroid/util/StatsLogInternal;->PLUGGED_STATE_CHANGED__STATE__BATTERY_PLUGGED_USB:I
-Landroid/util/StatsLogInternal;->PLUGGED_STATE_CHANGED__STATE__BATTERY_PLUGGED_WIRELESS:I
-Landroid/util/StatsLogInternal;->PROCESS_LIFE_CYCLE_STATE_CHANGED:I
-Landroid/util/StatsLogInternal;->PROCESS_LIFE_CYCLE_STATE_CHANGED__STATE__CRASHED:I
-Landroid/util/StatsLogInternal;->PROCESS_LIFE_CYCLE_STATE_CHANGED__STATE__FINISHED:I
-Landroid/util/StatsLogInternal;->PROCESS_LIFE_CYCLE_STATE_CHANGED__STATE__STARTED:I
-Landroid/util/StatsLogInternal;->PROCESS_MEMORY_STATE:I
-Landroid/util/StatsLogInternal;->REMAINING_BATTERY_CAPACITY:I
-Landroid/util/StatsLogInternal;->RESOURCE_CONFIGURATION_CHANGED:I
-Landroid/util/StatsLogInternal;->SCHEDULED_JOB_STATE_CHANGED:I
-Landroid/util/StatsLogInternal;->SCHEDULED_JOB_STATE_CHANGED__STATE__FINISHED:I
-Landroid/util/StatsLogInternal;->SCHEDULED_JOB_STATE_CHANGED__STATE__SCHEDULED:I
-Landroid/util/StatsLogInternal;->SCHEDULED_JOB_STATE_CHANGED__STATE__STARTED:I
-Landroid/util/StatsLogInternal;->SCHEDULED_JOB_STATE_CHANGED__STOP_REASON__STOP_REASON_CANCELLED:I
-Landroid/util/StatsLogInternal;->SCHEDULED_JOB_STATE_CHANGED__STOP_REASON__STOP_REASON_CONSTRAINTS_NOT_SATISFIED:I
-Landroid/util/StatsLogInternal;->SCHEDULED_JOB_STATE_CHANGED__STOP_REASON__STOP_REASON_DEVICE_IDLE:I
-Landroid/util/StatsLogInternal;->SCHEDULED_JOB_STATE_CHANGED__STOP_REASON__STOP_REASON_PREEMPT:I
-Landroid/util/StatsLogInternal;->SCHEDULED_JOB_STATE_CHANGED__STOP_REASON__STOP_REASON_TIMEOUT:I
-Landroid/util/StatsLogInternal;->SCHEDULED_JOB_STATE_CHANGED__STOP_REASON__STOP_REASON_UNKNOWN:I
-Landroid/util/StatsLogInternal;->SCREEN_BRIGHTNESS_CHANGED:I
-Landroid/util/StatsLogInternal;->SCREEN_STATE_CHANGED:I
-Landroid/util/StatsLogInternal;->SCREEN_STATE_CHANGED__STATE__DISPLAY_STATE_DOZE:I
-Landroid/util/StatsLogInternal;->SCREEN_STATE_CHANGED__STATE__DISPLAY_STATE_DOZE_SUSPEND:I
-Landroid/util/StatsLogInternal;->SCREEN_STATE_CHANGED__STATE__DISPLAY_STATE_OFF:I
-Landroid/util/StatsLogInternal;->SCREEN_STATE_CHANGED__STATE__DISPLAY_STATE_ON:I
-Landroid/util/StatsLogInternal;->SCREEN_STATE_CHANGED__STATE__DISPLAY_STATE_ON_SUSPEND:I
-Landroid/util/StatsLogInternal;->SCREEN_STATE_CHANGED__STATE__DISPLAY_STATE_UNKNOWN:I
-Landroid/util/StatsLogInternal;->SCREEN_STATE_CHANGED__STATE__DISPLAY_STATE_VR:I
-Landroid/util/StatsLogInternal;->SENSOR_STATE_CHANGED:I
-Landroid/util/StatsLogInternal;->SENSOR_STATE_CHANGED__STATE__OFF:I
-Landroid/util/StatsLogInternal;->SENSOR_STATE_CHANGED__STATE__ON:I
-Landroid/util/StatsLogInternal;->SETTING_CHANGED:I
-Landroid/util/StatsLogInternal;->SETTING_CHANGED__REASON__DELETED:I
-Landroid/util/StatsLogInternal;->SETTING_CHANGED__REASON__UPDATED:I
-Landroid/util/StatsLogInternal;->SHUTDOWN_SEQUENCE_REPORTED:I
-Landroid/util/StatsLogInternal;->SPEAKER_IMPEDANCE_REPORTED:I
-Landroid/util/StatsLogInternal;->SUBSYSTEM_SLEEP_STATE:I
-Landroid/util/StatsLogInternal;->SYNC_STATE_CHANGED:I
-Landroid/util/StatsLogInternal;->SYNC_STATE_CHANGED__STATE__OFF:I
-Landroid/util/StatsLogInternal;->SYNC_STATE_CHANGED__STATE__ON:I
-Landroid/util/StatsLogInternal;->SYSTEM_ELAPSED_REALTIME:I
-Landroid/util/StatsLogInternal;->SYSTEM_UPTIME:I
-Landroid/util/StatsLogInternal;->TEMPERATURE:I
-Landroid/util/StatsLogInternal;->TEMPERATURE__SENSOR_LOCATION__TEMPERATURE_TYPE_BATTERY:I
-Landroid/util/StatsLogInternal;->TEMPERATURE__SENSOR_LOCATION__TEMPERATURE_TYPE_CPU:I
-Landroid/util/StatsLogInternal;->TEMPERATURE__SENSOR_LOCATION__TEMPERATURE_TYPE_GPU:I
-Landroid/util/StatsLogInternal;->TEMPERATURE__SENSOR_LOCATION__TEMPERATURE_TYPE_SKIN:I
-Landroid/util/StatsLogInternal;->TEMPERATURE__SENSOR_LOCATION__TEMPERATURE_TYPE_UNKNOWN:I
-Landroid/util/StatsLogInternal;->UID_PROCESS_STATE_CHANGED:I
-Landroid/util/StatsLogInternal;->UID_PROCESS_STATE_CHANGED__STATE__PROCESS_STATE_BACKUP:I
-Landroid/util/StatsLogInternal;->UID_PROCESS_STATE_CHANGED__STATE__PROCESS_STATE_BOUND_FOREGROUND_SERVICE:I
-Landroid/util/StatsLogInternal;->UID_PROCESS_STATE_CHANGED__STATE__PROCESS_STATE_CACHED_ACTIVITY:I
-Landroid/util/StatsLogInternal;->UID_PROCESS_STATE_CHANGED__STATE__PROCESS_STATE_CACHED_ACTIVITY_CLIENT:I
-Landroid/util/StatsLogInternal;->UID_PROCESS_STATE_CHANGED__STATE__PROCESS_STATE_CACHED_EMPTY:I
-Landroid/util/StatsLogInternal;->UID_PROCESS_STATE_CHANGED__STATE__PROCESS_STATE_CACHED_RECENT:I
-Landroid/util/StatsLogInternal;->UID_PROCESS_STATE_CHANGED__STATE__PROCESS_STATE_FOREGROUND_SERVICE:I
-Landroid/util/StatsLogInternal;->UID_PROCESS_STATE_CHANGED__STATE__PROCESS_STATE_HEAVY_WEIGHT:I
-Landroid/util/StatsLogInternal;->UID_PROCESS_STATE_CHANGED__STATE__PROCESS_STATE_HOME:I
-Landroid/util/StatsLogInternal;->UID_PROCESS_STATE_CHANGED__STATE__PROCESS_STATE_IMPORTANT_BACKGROUND:I
-Landroid/util/StatsLogInternal;->UID_PROCESS_STATE_CHANGED__STATE__PROCESS_STATE_IMPORTANT_FOREGROUND:I
-Landroid/util/StatsLogInternal;->UID_PROCESS_STATE_CHANGED__STATE__PROCESS_STATE_LAST_ACTIVITY:I
-Landroid/util/StatsLogInternal;->UID_PROCESS_STATE_CHANGED__STATE__PROCESS_STATE_NONEXISTENT:I
-Landroid/util/StatsLogInternal;->UID_PROCESS_STATE_CHANGED__STATE__PROCESS_STATE_PERSISTENT:I
-Landroid/util/StatsLogInternal;->UID_PROCESS_STATE_CHANGED__STATE__PROCESS_STATE_PERSISTENT_UI:I
-Landroid/util/StatsLogInternal;->UID_PROCESS_STATE_CHANGED__STATE__PROCESS_STATE_RECEIVER:I
-Landroid/util/StatsLogInternal;->UID_PROCESS_STATE_CHANGED__STATE__PROCESS_STATE_SERVICE:I
-Landroid/util/StatsLogInternal;->UID_PROCESS_STATE_CHANGED__STATE__PROCESS_STATE_TOP:I
-Landroid/util/StatsLogInternal;->UID_PROCESS_STATE_CHANGED__STATE__PROCESS_STATE_TOP_SLEEPING:I
-Landroid/util/StatsLogInternal;->UID_PROCESS_STATE_CHANGED__STATE__PROCESS_STATE_TRANSIENT_BACKGROUND:I
-Landroid/util/StatsLogInternal;->UID_PROCESS_STATE_CHANGED__STATE__PROCESS_STATE_UNKNOWN:I
-Landroid/util/StatsLogInternal;->UID_PROCESS_STATE_CHANGED__STATE__PROCESS_STATE_UNKNOWN_TO_PROTO:I
-Landroid/util/StatsLogInternal;->USB_CONNECTOR_STATE_CHANGED:I
-Landroid/util/StatsLogInternal;->USB_CONNECTOR_STATE_CHANGED__STATE__CONNECTED:I
-Landroid/util/StatsLogInternal;->USB_CONNECTOR_STATE_CHANGED__STATE__DISCONNECTED:I
-Landroid/util/StatsLogInternal;->USB_DEVICE_ATTACHED:I
-Landroid/util/StatsLogInternal;->WAKELOCK_STATE_CHANGED:I
-Landroid/util/StatsLogInternal;->WAKELOCK_STATE_CHANGED__LEVEL__DOZE_WAKE_LOCK:I
-Landroid/util/StatsLogInternal;->WAKELOCK_STATE_CHANGED__LEVEL__DRAW_WAKE_LOCK:I
-Landroid/util/StatsLogInternal;->WAKELOCK_STATE_CHANGED__LEVEL__FULL_WAKE_LOCK:I
-Landroid/util/StatsLogInternal;->WAKELOCK_STATE_CHANGED__LEVEL__PARTIAL_WAKE_LOCK:I
-Landroid/util/StatsLogInternal;->WAKELOCK_STATE_CHANGED__LEVEL__PROXIMITY_SCREEN_OFF_WAKE_LOCK:I
-Landroid/util/StatsLogInternal;->WAKELOCK_STATE_CHANGED__LEVEL__SCREEN_BRIGHT_WAKE_LOCK:I
-Landroid/util/StatsLogInternal;->WAKELOCK_STATE_CHANGED__LEVEL__SCREEN_DIM_WAKE_LOCK:I
-Landroid/util/StatsLogInternal;->WAKELOCK_STATE_CHANGED__STATE__ACQUIRE:I
-Landroid/util/StatsLogInternal;->WAKELOCK_STATE_CHANGED__STATE__CHANGE_ACQUIRE:I
-Landroid/util/StatsLogInternal;->WAKELOCK_STATE_CHANGED__STATE__CHANGE_RELEASE:I
-Landroid/util/StatsLogInternal;->WAKELOCK_STATE_CHANGED__STATE__RELEASE:I
-Landroid/util/StatsLogInternal;->WAKEUP_ALARM_OCCURRED:I
-Landroid/util/StatsLogInternal;->WIFI_ACTIVITY_INFO:I
-Landroid/util/StatsLogInternal;->WIFI_BYTES_TRANSFER:I
-Landroid/util/StatsLogInternal;->WIFI_BYTES_TRANSFER_BY_FG_BG:I
-Landroid/util/StatsLogInternal;->WIFI_LOCK_STATE_CHANGED:I
-Landroid/util/StatsLogInternal;->WIFI_LOCK_STATE_CHANGED__STATE__OFF:I
-Landroid/util/StatsLogInternal;->WIFI_LOCK_STATE_CHANGED__STATE__ON:I
-Landroid/util/StatsLogInternal;->WIFI_MULTICAST_LOCK_STATE_CHANGED:I
-Landroid/util/StatsLogInternal;->WIFI_MULTICAST_LOCK_STATE_CHANGED__STATE__OFF:I
-Landroid/util/StatsLogInternal;->WIFI_MULTICAST_LOCK_STATE_CHANGED__STATE__ON:I
-Landroid/util/StatsLogInternal;->WIFI_RADIO_POWER_STATE_CHANGED:I
-Landroid/util/StatsLogInternal;->WIFI_RADIO_POWER_STATE_CHANGED__STATE__DATA_CONNECTION_POWER_STATE_HIGH:I
-Landroid/util/StatsLogInternal;->WIFI_RADIO_POWER_STATE_CHANGED__STATE__DATA_CONNECTION_POWER_STATE_LOW:I
-Landroid/util/StatsLogInternal;->WIFI_RADIO_POWER_STATE_CHANGED__STATE__DATA_CONNECTION_POWER_STATE_MEDIUM:I
-Landroid/util/StatsLogInternal;->WIFI_RADIO_POWER_STATE_CHANGED__STATE__DATA_CONNECTION_POWER_STATE_UNKNOWN:I
-Landroid/util/StatsLogInternal;->WIFI_SCAN_STATE_CHANGED:I
-Landroid/util/StatsLogInternal;->WIFI_SCAN_STATE_CHANGED__STATE__OFF:I
-Landroid/util/StatsLogInternal;->WIFI_SCAN_STATE_CHANGED__STATE__ON:I
-Landroid/util/StatsLogInternal;->WIFI_SIGNAL_STRENGTH_CHANGED:I
-Landroid/util/StatsLogInternal;->WIFI_SIGNAL_STRENGTH_CHANGED__SIGNAL_STRENGTH__SIGNAL_STRENGTH_GOOD:I
-Landroid/util/StatsLogInternal;->WIFI_SIGNAL_STRENGTH_CHANGED__SIGNAL_STRENGTH__SIGNAL_STRENGTH_GREAT:I
-Landroid/util/StatsLogInternal;->WIFI_SIGNAL_STRENGTH_CHANGED__SIGNAL_STRENGTH__SIGNAL_STRENGTH_MODERATE:I
-Landroid/util/StatsLogInternal;->WIFI_SIGNAL_STRENGTH_CHANGED__SIGNAL_STRENGTH__SIGNAL_STRENGTH_NONE_OR_UNKNOWN:I
-Landroid/util/StatsLogInternal;->WIFI_SIGNAL_STRENGTH_CHANGED__SIGNAL_STRENGTH__SIGNAL_STRENGTH_POOR:I
-Landroid/util/StatsLogInternal;->write(I)I
-Landroid/util/StatsLogInternal;->write(II)I
-Landroid/util/StatsLogInternal;->write(III)I
-Landroid/util/StatsLogInternal;->write(IIIFIIIIIIIIIIIIII)I
-Landroid/util/StatsLogInternal;->write(IIII)I
-Landroid/util/StatsLogInternal;->write(IIIIIIIII)I
-Landroid/util/StatsLogInternal;->write(IIIIJZ)I
-Landroid/util/StatsLogInternal;->write(IIIJ)I
-Landroid/util/StatsLogInternal;->write(IIIZZ)I
-Landroid/util/StatsLogInternal;->write(IIIZZZ)I
-Landroid/util/StatsLogInternal;->write(IIJ)I
-Landroid/util/StatsLogInternal;->write(IIJJ)I
-Landroid/util/StatsLogInternal;->write(IIJJJJ)I
-Landroid/util/StatsLogInternal;->write(IILjava/lang/String;I)I
-Landroid/util/StatsLogInternal;->write(IILjava/lang/String;IJJJJJ)I
-Landroid/util/StatsLogInternal;->write(IILjava/lang/String;ILjava/lang/String;)I
-Landroid/util/StatsLogInternal;->write(IILjava/lang/String;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;III)I
-Landroid/util/StatsLogInternal;->write(IILjava/lang/String;ILjava/lang/String;Ljava/lang/String;ZJIIIIILjava/lang/String;II)I
-Landroid/util/StatsLogInternal;->write(IILjava/lang/String;ILjava/lang/String;ZJ)I
-Landroid/util/StatsLogInternal;->write(IILjava/lang/String;Ljava/lang/String;I)I
-Landroid/util/StatsLogInternal;->write(IILjava/lang/String;Ljava/lang/String;ILjava/lang/String;II)I
-Landroid/util/StatsLogInternal;->write(IILjava/lang/String;Ljava/lang/String;JJJJJ)I
-Landroid/util/StatsLogInternal;->write(IILjava/lang/String;Ljava/lang/String;Ljava/lang/String;II)I
-Landroid/util/StatsLogInternal;->write(IILjava/lang/String;ZI)I
-Landroid/util/StatsLogInternal;->write(IIZJJJJ)I
-Landroid/util/StatsLogInternal;->write(IJ)I
-Landroid/util/StatsLogInternal;->write(IJIJJJJ)I
-Landroid/util/StatsLogInternal;->write(IJJJ)I
-Landroid/util/StatsLogInternal;->write(IJJJJJJJJJJ)I
-Landroid/util/StatsLogInternal;->write(ILjava/lang/String;IIJ)I
-Landroid/util/StatsLogInternal;->write(ILjava/lang/String;J)I
-Landroid/util/StatsLogInternal;->write(ILjava/lang/String;Ljava/lang/String;JJ)I
-Landroid/util/StatsLogInternal;->write(ILjava/lang/String;Ljava/lang/String;JJJJ)I
-Landroid/util/StatsLogInternal;->write(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZII)I
-Landroid/util/StatsLogInternal;->write(IZLjava/lang/String;JJ)I
-Landroid/util/StatsLogInternal;->write(I[I[Ljava/lang/String;I)I
-Landroid/util/StatsLogInternal;->write(I[I[Ljava/lang/String;II)I
-Landroid/util/StatsLogInternal;->write(I[I[Ljava/lang/String;IILjava/lang/String;)I
-Landroid/util/StatsLogInternal;->write(I[I[Ljava/lang/String;ILjava/lang/String;I)I
-Landroid/util/StatsLogInternal;->write(I[I[Ljava/lang/String;IZZZ)I
-Landroid/util/StatsLogInternal;->write(I[I[Ljava/lang/String;Ljava/lang/String;)I
-Landroid/util/StatsLogInternal;->write(I[I[Ljava/lang/String;Ljava/lang/String;I)I
-Landroid/util/StatsLogInternal;->write(I[I[Ljava/lang/String;Ljava/lang/String;II)I
-Landroid/util/StatsLogInternal;->write(I[I[Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I)I
-Landroid/util/StatsLogInternal;->write_non_chained(IILjava/lang/String;I)I
-Landroid/util/StatsLogInternal;->write_non_chained(IILjava/lang/String;II)I
-Landroid/util/StatsLogInternal;->write_non_chained(IILjava/lang/String;IILjava/lang/String;)I
-Landroid/util/StatsLogInternal;->write_non_chained(IILjava/lang/String;ILjava/lang/String;I)I
-Landroid/util/StatsLogInternal;->write_non_chained(IILjava/lang/String;IZZZ)I
-Landroid/util/StatsLogInternal;->write_non_chained(IILjava/lang/String;Ljava/lang/String;)I
-Landroid/util/StatsLogInternal;->write_non_chained(IILjava/lang/String;Ljava/lang/String;I)I
-Landroid/util/StatsLogInternal;->write_non_chained(IILjava/lang/String;Ljava/lang/String;II)I
-Landroid/util/StatsLogInternal;->write_non_chained(IILjava/lang/String;Ljava/lang/String;Ljava/lang/String;I)I
-Landroid/util/StatsLogInternal;->WTF_OCCURRED:I
Landroid/util/StringBuilderPrinter;->mBuilder:Ljava/lang/StringBuilder;
Landroid/util/SuperNotCalledException;-><init>(Ljava/lang/String;)V
Landroid/util/TextLogEntry;-><init>()V
diff --git a/boot/hiddenapi/hiddenapi-max-target-r-loprio.txt b/boot/hiddenapi/hiddenapi-max-target-r-loprio.txt
index 753bc69b..79d2521 100644
--- a/boot/hiddenapi/hiddenapi-max-target-r-loprio.txt
+++ b/boot/hiddenapi/hiddenapi-max-target-r-loprio.txt
@@ -23,8 +23,6 @@
Landroid/net/INetworkPolicyListener$Stub;-><init>()V
Landroid/net/nsd/INsdManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/net/nsd/INsdManager;
Landroid/net/sip/ISipSession$Stub;->asInterface(Landroid/os/IBinder;)Landroid/net/sip/ISipSession;
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_getScanResults:I
-Landroid/net/wifi/p2p/IWifiP2pManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/net/wifi/p2p/IWifiP2pManager;
Landroid/nfc/INfcAdapter$Stub;->TRANSACTION_enable:I
Landroid/os/IPowerManager$Stub;->TRANSACTION_acquireWakeLock:I
Landroid/os/IPowerManager$Stub;->TRANSACTION_goToSleep:I
diff --git a/boot/hiddenapi/hiddenapi-unsupported.txt b/boot/hiddenapi/hiddenapi-unsupported.txt
index 4281b0d..002d42d 100644
--- a/boot/hiddenapi/hiddenapi-unsupported.txt
+++ b/boot/hiddenapi/hiddenapi-unsupported.txt
@@ -167,28 +167,12 @@
Landroid/media/IMediaScannerService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/media/IMediaScannerService;
Landroid/media/session/ISessionManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/media/session/ISessionManager;
Landroid/media/tv/ITvRemoteProvider$Stub;-><init>()V
-Landroid/net/IConnectivityManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/net/IConnectivityManager$Stub$Proxy;->getActiveLinkProperties()Landroid/net/LinkProperties;
-Landroid/net/IConnectivityManager$Stub$Proxy;->getActiveNetworkInfo()Landroid/net/NetworkInfo;
-Landroid/net/IConnectivityManager$Stub$Proxy;->getAllNetworkInfo()[Landroid/net/NetworkInfo;
-Landroid/net/IConnectivityManager$Stub$Proxy;->getAllNetworks()[Landroid/net/Network;
-Landroid/net/IConnectivityManager$Stub$Proxy;->getTetherableIfaces()[Ljava/lang/String;
-Landroid/net/IConnectivityManager$Stub$Proxy;->getTetherableUsbRegexs()[Ljava/lang/String;
-Landroid/net/IConnectivityManager$Stub$Proxy;->getTetheredIfaces()[Ljava/lang/String;
-Landroid/net/IConnectivityManager$Stub$Proxy;->mRemote:Landroid/os/IBinder;
-Landroid/net/IConnectivityManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/net/IConnectivityManager;
Landroid/net/INetworkManagementEventObserver$Stub;-><init>()V
Landroid/net/INetworkPolicyManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/net/INetworkPolicyManager;
Landroid/net/INetworkScoreService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/net/INetworkScoreService;
Landroid/net/INetworkStatsService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
Landroid/net/INetworkStatsService$Stub$Proxy;->getMobileIfaces()[Ljava/lang/String;
Landroid/net/INetworkStatsService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/net/INetworkStatsService;
-Landroid/net/wifi/IWifiManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/net/wifi/IWifiManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/net/wifi/IWifiManager;
-Landroid/net/wifi/IWifiScanner$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/net/wifi/IWifiScanner$Stub$Proxy;->mRemote:Landroid/os/IBinder;
-Landroid/net/wifi/IWifiScanner$Stub;-><init>()V
-Landroid/net/wifi/IWifiScanner$Stub;->asInterface(Landroid/os/IBinder;)Landroid/net/wifi/IWifiScanner;
Landroid/os/IBatteryPropertiesRegistrar$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
Landroid/os/IDeviceIdentifiersPolicyService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/os/IDeviceIdentifiersPolicyService;
Landroid/os/IDeviceIdleController$Stub;->asInterface(Landroid/os/IBinder;)Landroid/os/IDeviceIdleController;
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index 4182ac3..034ad8e 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -36,6 +36,7 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.annotation.UserIdInt;
import android.app.assist.AssistContent;
import android.app.assist.AssistStructure;
import android.app.backup.BackupAgent;
@@ -61,6 +62,7 @@
import android.content.ContentProvider;
import android.content.ContentResolver;
import android.content.Context;
+import android.content.Context.CreatePackageOptions;
import android.content.IContentProvider;
import android.content.IIntentReceiver;
import android.content.Intent;
@@ -71,6 +73,7 @@
import android.content.pm.InstrumentationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
+import android.content.pm.PackageManager.ApplicationInfoFlags;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.ParceledListSlice;
import android.content.pm.PermissionInfo;
@@ -218,8 +221,6 @@
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
-import java.lang.ref.Reference;
-import java.lang.ref.ReferenceQueue;
import java.lang.ref.WeakReference;
import java.lang.reflect.Method;
import java.net.InetAddress;
@@ -230,7 +231,6 @@
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
-import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Objects;
@@ -419,16 +419,6 @@
@GuardedBy("mResourcesManager")
@UnsupportedAppUsage
final ArrayMap<String, WeakReference<LoadedApk>> mResourcePackages = new ArrayMap<>();
-
- @GuardedBy("mResourcesManager")
- private final ArrayMap<List<String>, WeakReference<LoadedApk>> mPackageNonAMS =
- new ArrayMap<>();
- @GuardedBy("mResourcesManager")
- private final ArrayMap<List<String>, WeakReference<LoadedApk>> mResourcePackagesNonAMS =
- new ArrayMap<>();
- @GuardedBy("mResourcesManager")
- private final ReferenceQueue<LoadedApk> mPackageRefQueue = new ReferenceQueue<>();
-
@GuardedBy("mResourcesManager")
final ArrayList<ActivityClientRecord> mRelaunchingActivities = new ArrayList<>();
@GuardedBy("mResourcesManager")
@@ -1182,7 +1172,6 @@
}
public void scheduleApplicationInfoChanged(ApplicationInfo ai) {
- mResourcesManager.updatePendingAppInfoUpdates(ai);
mH.removeMessages(H.APPLICATION_INFO_CHANGED, ai);
sendMessage(H.APPLICATION_INFO_CHANGED, ai);
}
@@ -2385,281 +2374,72 @@
return mH;
}
- /**
- * If {@code retainReferences} is false, prunes all {@link LoadedApk} representing any of the
- * specified packages from the package caches.
- *
- * @return whether the cache contains a loaded apk representing any of the specified packages
- */
- private boolean clearCachedApks() {
- synchronized (mResourcesManager) {
- Reference<? extends LoadedApk> enqueuedRef = mPackageRefQueue.poll();
- if (enqueuedRef == null) {
- return false;
- }
-
- final HashSet<Reference<? extends LoadedApk>> deadReferences = new HashSet<>();
- for (; enqueuedRef != null; enqueuedRef = mPackageRefQueue.poll()) {
- deadReferences.add(enqueuedRef);
- }
-
- return cleanWeakMapValues(mPackages, deadReferences)
- || cleanWeakMapValues(mResourcePackages, deadReferences)
- || cleanWeakMapValues(mPackageNonAMS, deadReferences)
- || cleanWeakMapValues(mResourcePackages, deadReferences);
- }
- }
-
- private static <K> boolean cleanWeakMapValues(ArrayMap<K, WeakReference<LoadedApk>> map,
- HashSet<Reference<? extends LoadedApk>> deadReferences) {
- boolean hasPkgInfo = false;
- for (int i = map.size() - 1; i >= 0; i--) {
- if (deadReferences.contains(map.valueAt(i))) {
- map.removeAt(i);
- hasPkgInfo = true;
- }
- }
- return hasPkgInfo;
- }
-
- /**
- * Retrieves the previously cached {@link LoadedApk} that was created/updated with the most
- * recent {@link ApplicationInfo} sent from the activity manager service.
- */
- @Nullable
- private LoadedApk peekLatestCachedApkFromAMS(@NonNull String packageName, boolean includeCode) {
- synchronized (mResourcesManager) {
- WeakReference<LoadedApk> ref;
- if (includeCode) {
- return ((ref = mPackages.get(packageName)) != null) ? ref.get() : null;
- } else {
- return ((ref = mResourcePackages.get(packageName)) != null) ? ref.get() : null;
- }
- }
- }
-
- /**
- * Updates the previously cached {@link LoadedApk} that was created/updated using an
- * {@link ApplicationInfo} sent from activity manager service.
- *
- * If {@code appInfo} is null, the most up-to-date {@link ApplicationInfo} will be fetched and
- * used to update the cached package; otherwise, the specified app info will be used.
- */
- private boolean updateLatestCachedApkFromAMS(@NonNull String packageName,
- @Nullable ApplicationInfo appInfo, boolean updateActivityRecords) {
- final LoadedApk[] loadedPackages = new LoadedApk[]{
- peekLatestCachedApkFromAMS(packageName, true),
- peekLatestCachedApkFromAMS(packageName, false)
- };
-
- try {
- if (appInfo == null) {
- appInfo = sPackageManager.getApplicationInfo(
- packageName, PackageManager.GET_SHARED_LIBRARY_FILES,
- UserHandle.myUserId());
- }
- } catch (RemoteException e) {
- Slog.v(TAG, "Failed to get most recent app info for '" + packageName + "'", e);
- return false;
- }
-
- boolean hasPackage = false;
- final String[] oldResDirs = new String[loadedPackages.length];
- for (int i = loadedPackages.length - 1; i >= 0; i--) {
- final LoadedApk loadedPackage = loadedPackages[i];
- if (loadedPackage == null) {
- continue;
- }
-
- // If the package is being updated, yet it still has a valid LoadedApk object, the
- // package was updated with PACKAGE_REMOVED_DONT_KILL. Adjust it's internal references
- // to the application info and resources.
- hasPackage = true;
- if (updateActivityRecords && mActivities.size() > 0) {
- for (ActivityClientRecord ar : mActivities.values()) {
- if (ar.activityInfo.applicationInfo.packageName.equals(packageName)) {
- ar.activityInfo.applicationInfo = appInfo;
- ar.packageInfo = loadedPackage;
- }
- }
- }
-
- updateLoadedApk(loadedPackage, appInfo);
- oldResDirs[i] = loadedPackage.getResDir();
- }
- if (hasPackage) {
- synchronized (mResourcesManager) {
- mResourcesManager.applyNewResourceDirs(appInfo, oldResDirs);
- }
- }
- return hasPackage;
- }
-
- private static List<String> makeNonAMSKey(@NonNull ApplicationInfo appInfo) {
- final List<String> paths = new ArrayList<>();
- paths.add(appInfo.sourceDir);
- if (appInfo.resourceDirs != null) {
- for (String path : appInfo.resourceDirs) {
- paths.add(path);
- }
- }
- return paths;
- }
-
- /**
- * Retrieves the previously cached {@link LoadedApk}.
- *
- * If {@code isAppInfoFromAMS} is true, then {@code appInfo} will be used to update the paths
- * of the previously cached {@link LoadedApk} that was created/updated using an
- * {@link ApplicationInfo} sent from activity manager service.
- */
- @Nullable
- private LoadedApk retrieveCachedApk(@NonNull ApplicationInfo appInfo, boolean includeCode,
- boolean isAppInfoFromAMS) {
- if (UserHandle.myUserId() != UserHandle.getUserId(appInfo.uid)) {
- // Caching not supported across users.
- return null;
- }
-
- if (isAppInfoFromAMS) {
- LoadedApk loadedPackage = peekLatestCachedApkFromAMS(appInfo.packageName, includeCode);
- if (loadedPackage != null) {
- updateLoadedApk(loadedPackage, appInfo);
- }
- return loadedPackage;
- }
-
- synchronized (mResourcesManager) {
- WeakReference<LoadedApk> ref;
- if (includeCode) {
- return ((ref = mPackageNonAMS.get(makeNonAMSKey(appInfo))) != null)
- ? ref.get() : null;
- } else {
- return ((ref = mResourcePackagesNonAMS.get(makeNonAMSKey(appInfo))) != null)
- ? ref.get() : null;
- }
- }
- }
-
- private static boolean isLoadedApkResourceDirsUpToDate(LoadedApk loadedApk,
- ApplicationInfo appInfo) {
- boolean baseDirsUpToDate = loadedApk.getResDir().equals(appInfo.sourceDir);
- boolean resourceDirsUpToDate = Arrays.equals(
- ArrayUtils.defeatNullable(appInfo.resourceDirs),
- ArrayUtils.defeatNullable(loadedApk.getOverlayDirs()));
- boolean overlayPathsUpToDate = Arrays.equals(
- ArrayUtils.defeatNullable(appInfo.overlayPaths),
- ArrayUtils.defeatNullable(loadedApk.getOverlayPaths()));
-
- return (loadedApk.mResources == null || loadedApk.mResources.getAssets().isUpToDate())
- && baseDirsUpToDate && resourceDirsUpToDate && overlayPathsUpToDate;
- }
-
- private void updateLoadedApk(@NonNull LoadedApk loadedPackage,
- @NonNull ApplicationInfo appInfo) {
- if (isLoadedApkResourceDirsUpToDate(loadedPackage, appInfo)) {
- return;
- }
-
- final List<String> oldPaths = new ArrayList<>();
- LoadedApk.makePaths(this, appInfo, oldPaths);
- loadedPackage.updateApplicationInfo(appInfo, oldPaths);
- }
-
- @Nullable
- private LoadedApk createLoadedPackage(@NonNull ApplicationInfo appInfo,
- @Nullable CompatibilityInfo compatInfo, @Nullable ClassLoader baseLoader,
- boolean securityViolation, boolean includeCode, boolean registerPackage,
- boolean isAppInfoFromAMS) {
- final LoadedApk packageInfo =
- new LoadedApk(this, appInfo, compatInfo, baseLoader,
- securityViolation, includeCode
- && (appInfo.flags & ApplicationInfo.FLAG_HAS_CODE) != 0, registerPackage);
-
- if (mSystemThread && "android".equals(appInfo.packageName)) {
- packageInfo.installSystemApplicationInfo(appInfo,
- getSystemContext().mPackageInfo.getClassLoader());
- }
-
- if (UserHandle.myUserId() != UserHandle.getUserId(appInfo.uid)) {
- // Caching not supported across users
- return packageInfo;
- }
-
- synchronized (mResourcesManager) {
- if (includeCode) {
- if (isAppInfoFromAMS) {
- mPackages.put(appInfo.packageName,
- new WeakReference<>(packageInfo, mPackageRefQueue));
- } else {
- mPackageNonAMS.put(makeNonAMSKey(appInfo),
- new WeakReference<>(packageInfo, mPackageRefQueue));
- }
- } else {
- if (isAppInfoFromAMS) {
- mResourcePackages.put(appInfo.packageName,
- new WeakReference<>(packageInfo, mPackageRefQueue));
- } else {
- mResourcePackagesNonAMS.put(makeNonAMSKey(appInfo),
- new WeakReference<>(packageInfo, mPackageRefQueue));
- }
- }
- return packageInfo;
- }
- }
-
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023)
public final LoadedApk getPackageInfo(String packageName, CompatibilityInfo compatInfo,
- int flags) {
+ @CreatePackageOptions int flags) {
return getPackageInfo(packageName, compatInfo, flags, UserHandle.myUserId());
}
public final LoadedApk getPackageInfo(String packageName, CompatibilityInfo compatInfo,
- int flags, int userId) {
- final ApplicationInfo ai = PackageManager.getApplicationInfoAsUserCached(
+ @CreatePackageOptions int flags, @UserIdInt int userId) {
+ return getPackageInfo(packageName, compatInfo, flags, userId, 0 /* packageFlags */);
+ }
+
+ public final LoadedApk getPackageInfo(String packageName, CompatibilityInfo compatInfo,
+ @CreatePackageOptions int flags, @UserIdInt int userId,
+ @ApplicationInfoFlags int packageFlags) {
+ final boolean differentUser = (UserHandle.myUserId() != userId);
+ ApplicationInfo ai = PackageManager.getApplicationInfoAsUserCached(
packageName,
- PackageManager.GET_SHARED_LIBRARY_FILES
+ packageFlags | PackageManager.GET_SHARED_LIBRARY_FILES
| PackageManager.MATCH_DEBUG_TRIAGED_MISSING,
(userId < 0) ? UserHandle.myUserId() : userId);
- LoadedApk packageInfo = null;
- if (ai != null) {
- packageInfo = retrieveCachedApk(ai,
- (flags & Context.CONTEXT_INCLUDE_CODE) != 0,
- false);
- }
-
- if (packageInfo != null) {
- if (packageInfo.isSecurityViolation()
- && (flags & Context.CONTEXT_IGNORE_SECURITY) == 0) {
- throw new SecurityException(
- "Requesting code from " + packageName
- + " to be run in process "
- + mBoundApplication.processName
- + "/" + mBoundApplication.appInfo.uid);
+ synchronized (mResourcesManager) {
+ WeakReference<LoadedApk> ref;
+ if (differentUser) {
+ // Caching not supported across users
+ ref = null;
+ } else if ((flags & Context.CONTEXT_INCLUDE_CODE) != 0) {
+ ref = mPackages.get(packageName);
+ } else {
+ ref = mResourcePackages.get(packageName);
}
- return packageInfo;
+
+ LoadedApk packageInfo = ref != null ? ref.get() : null;
+ if (ai != null && packageInfo != null) {
+ if (!isLoadedApkResourceDirsUpToDate(packageInfo, ai)) {
+ List<String> oldPaths = new ArrayList<>();
+ LoadedApk.makePaths(this, ai, oldPaths);
+ packageInfo.updateApplicationInfo(ai, oldPaths);
+ }
+
+ if (packageInfo.isSecurityViolation()
+ && (flags&Context.CONTEXT_IGNORE_SECURITY) == 0) {
+ throw new SecurityException(
+ "Requesting code from " + packageName
+ + " to be run in process "
+ + mBoundApplication.processName
+ + "/" + mBoundApplication.appInfo.uid);
+ }
+ return packageInfo;
+ }
}
- return ai == null ? null : getPackageInfo(ai, compatInfo, flags, false);
+ if (ai != null) {
+ return getPackageInfo(ai, compatInfo, flags);
+ }
+
+ return null;
}
- /**
- * @deprecated Use {@link #getPackageInfo(ApplicationInfo, CompatibilityInfo, int, boolean)}
- * instead.
- */
- @Deprecated
@UnsupportedAppUsage(trackingBug = 171933273)
public final LoadedApk getPackageInfo(ApplicationInfo ai, CompatibilityInfo compatInfo,
- int flags) {
- return getPackageInfo(ai, compatInfo, flags, true);
- }
-
- public final LoadedApk getPackageInfo(ApplicationInfo ai, CompatibilityInfo compatInfo,
- @Context.CreatePackageOptions int flags, boolean isAppInfoFromAMS) {
+ @CreatePackageOptions int flags) {
boolean includeCode = (flags&Context.CONTEXT_INCLUDE_CODE) != 0;
boolean securityViolation = includeCode && ai.uid != 0
- && ai.uid != Process.SYSTEM_UID && (mBoundApplication == null
- || !UserHandle.isSameApp(ai.uid, mBoundApplication.appInfo.uid));
+ && ai.uid != Process.SYSTEM_UID && (mBoundApplication != null
+ ? !UserHandle.isSameApp(ai.uid, mBoundApplication.appInfo.uid)
+ : true);
boolean registerPackage = includeCode && (flags&Context.CONTEXT_REGISTER_PACKAGE) != 0;
if ((flags&(Context.CONTEXT_INCLUDE_CODE
|Context.CONTEXT_IGNORE_SECURITY))
@@ -2669,47 +2449,107 @@
+ " (with uid " + ai.uid + ")";
if (mBoundApplication != null) {
msg = msg + " to be run in process "
- + mBoundApplication.processName + " (with uid "
- + mBoundApplication.appInfo.uid + ")";
+ + mBoundApplication.processName + " (with uid "
+ + mBoundApplication.appInfo.uid + ")";
}
throw new SecurityException(msg);
}
}
return getPackageInfo(ai, compatInfo, null, securityViolation, includeCode,
- registerPackage, isAppInfoFromAMS);
+ registerPackage);
}
@Override
@UnsupportedAppUsage
public final LoadedApk getPackageInfoNoCheck(ApplicationInfo ai,
CompatibilityInfo compatInfo) {
- return getPackageInfo(ai, compatInfo, null, false, true, false, true);
+ return getPackageInfo(ai, compatInfo, null, false, true, false);
}
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023)
public final LoadedApk peekPackageInfo(String packageName, boolean includeCode) {
synchronized (mResourcesManager) {
- return peekLatestCachedApkFromAMS(packageName, includeCode);
+ WeakReference<LoadedApk> ref;
+ if (includeCode) {
+ ref = mPackages.get(packageName);
+ } else {
+ ref = mResourcePackages.get(packageName);
+ }
+ return ref != null ? ref.get() : null;
}
}
private LoadedApk getPackageInfo(ApplicationInfo aInfo, CompatibilityInfo compatInfo,
ClassLoader baseLoader, boolean securityViolation, boolean includeCode,
- boolean registerPackage, boolean isAppInfoFromAMS) {
- LoadedApk packageInfo = retrieveCachedApk(aInfo, includeCode,
- isAppInfoFromAMS);
- if (packageInfo != null) {
+ boolean registerPackage) {
+ final boolean differentUser = (UserHandle.myUserId() != UserHandle.getUserId(aInfo.uid));
+ synchronized (mResourcesManager) {
+ WeakReference<LoadedApk> ref;
+ if (differentUser) {
+ // Caching not supported across users
+ ref = null;
+ } else if (includeCode) {
+ ref = mPackages.get(aInfo.packageName);
+ } else {
+ ref = mResourcePackages.get(aInfo.packageName);
+ }
+
+ LoadedApk packageInfo = ref != null ? ref.get() : null;
+
+ if (packageInfo != null) {
+ if (!isLoadedApkResourceDirsUpToDate(packageInfo, aInfo)) {
+ List<String> oldPaths = new ArrayList<>();
+ LoadedApk.makePaths(this, aInfo, oldPaths);
+ packageInfo.updateApplicationInfo(aInfo, oldPaths);
+ }
+
+ return packageInfo;
+ }
+
+ if (localLOGV) {
+ Slog.v(TAG, (includeCode ? "Loading code package "
+ : "Loading resource-only package ") + aInfo.packageName
+ + " (in " + (mBoundApplication != null
+ ? mBoundApplication.processName : null)
+ + ")");
+ }
+
+ packageInfo =
+ new LoadedApk(this, aInfo, compatInfo, baseLoader,
+ securityViolation, includeCode
+ && (aInfo.flags & ApplicationInfo.FLAG_HAS_CODE) != 0, registerPackage);
+
+ if (mSystemThread && "android".equals(aInfo.packageName)) {
+ packageInfo.installSystemApplicationInfo(aInfo,
+ getSystemContext().mPackageInfo.getClassLoader());
+ }
+
+ if (differentUser) {
+ // Caching not supported across users
+ } else if (includeCode) {
+ mPackages.put(aInfo.packageName,
+ new WeakReference<LoadedApk>(packageInfo));
+ } else {
+ mResourcePackages.put(aInfo.packageName,
+ new WeakReference<LoadedApk>(packageInfo));
+ }
+
return packageInfo;
}
- if (localLOGV) {
- Slog.v(TAG, (includeCode ? "Loading code package "
- : "Loading resource-only package ") + aInfo.packageName
- + " (in " + (mBoundApplication != null
- ? mBoundApplication.processName : null)
- + ")");
- }
- return createLoadedPackage(aInfo, compatInfo, baseLoader,
- securityViolation, includeCode, registerPackage, isAppInfoFromAMS);
+ }
+
+ private static boolean isLoadedApkResourceDirsUpToDate(LoadedApk loadedApk,
+ ApplicationInfo appInfo) {
+ Resources packageResources = loadedApk.mResources;
+ boolean resourceDirsUpToDate = Arrays.equals(
+ ArrayUtils.defeatNullable(appInfo.resourceDirs),
+ ArrayUtils.defeatNullable(loadedApk.getOverlayDirs()));
+ boolean overlayPathsUpToDate = Arrays.equals(
+ ArrayUtils.defeatNullable(appInfo.overlayPaths),
+ ArrayUtils.defeatNullable(loadedApk.getOverlayPaths()));
+
+ return (packageResources == null || packageResources.getAssets().isUpToDate())
+ && resourceDirsUpToDate && overlayPathsUpToDate;
}
@UnsupportedAppUsage
@@ -3671,7 +3511,7 @@
ActivityInfo aInfo = r.activityInfo;
if (r.packageInfo == null) {
r.packageInfo = getPackageInfo(aInfo.applicationInfo, r.compatInfo,
- Context.CONTEXT_INCLUDE_CODE, true);
+ Context.CONTEXT_INCLUDE_CODE);
}
ComponentName component = r.intent.getComponent();
@@ -6154,10 +5994,40 @@
@VisibleForTesting(visibility = PACKAGE)
public void handleApplicationInfoChanged(@NonNull final ApplicationInfo ai) {
- // Updates triggered by package installation go through a package update receiver. Here we
- // try to capture ApplicationInfo changes that are caused by other sources, such as
- // overlays. That means we want to be as conservative about code changes as possible.
- updateLatestCachedApkFromAMS(ai.packageName, ai, false);
+ // Updates triggered by package installation go through a package update
+ // receiver. Here we try to capture ApplicationInfo changes that are
+ // caused by other sources, such as overlays. That means we want to be as conservative
+ // about code changes as possible. Take the diff of the old ApplicationInfo and the new
+ // to see if anything needs to change.
+ LoadedApk apk;
+ LoadedApk resApk;
+ // Update all affected loaded packages with new package information
+ synchronized (mResourcesManager) {
+ WeakReference<LoadedApk> ref = mPackages.get(ai.packageName);
+ apk = ref != null ? ref.get() : null;
+ ref = mResourcePackages.get(ai.packageName);
+ resApk = ref != null ? ref.get() : null;
+ }
+
+ final String[] oldResDirs = new String[2];
+
+ if (apk != null) {
+ oldResDirs[0] = apk.getResDir();
+ final ArrayList<String> oldPaths = new ArrayList<>();
+ LoadedApk.makePaths(this, apk.getApplicationInfo(), oldPaths);
+ apk.updateApplicationInfo(ai, oldPaths);
+ }
+ if (resApk != null) {
+ oldResDirs[1] = resApk.getResDir();
+ final ArrayList<String> oldPaths = new ArrayList<>();
+ LoadedApk.makePaths(this, resApk.getApplicationInfo(), oldPaths);
+ resApk.updateApplicationInfo(ai, oldPaths);
+ }
+
+ synchronized (mResourcesManager) {
+ // Update all affected Resources objects to use new ResourcesImpl
+ mResourcesManager.applyNewResourceDirs(ai, oldResDirs);
+ }
}
/**
@@ -6334,7 +6204,29 @@
case ApplicationThreadConstants.PACKAGE_REMOVED:
case ApplicationThreadConstants.PACKAGE_REMOVED_DONT_KILL:
{
- hasPkgInfo = clearCachedApks();
+ final boolean killApp = cmd == ApplicationThreadConstants.PACKAGE_REMOVED;
+ if (packages == null) {
+ break;
+ }
+ synchronized (mResourcesManager) {
+ for (int i = packages.length - 1; i >= 0; i--) {
+ if (!hasPkgInfo) {
+ WeakReference<LoadedApk> ref = mPackages.get(packages[i]);
+ if (ref != null && ref.get() != null) {
+ hasPkgInfo = true;
+ } else {
+ ref = mResourcePackages.get(packages[i]);
+ if (ref != null && ref.get() != null) {
+ hasPkgInfo = true;
+ }
+ }
+ }
+ if (killApp) {
+ mPackages.remove(packages[i]);
+ mResourcePackages.remove(packages[i]);
+ }
+ }
+ }
break;
}
case ApplicationThreadConstants.PACKAGE_REPLACED:
@@ -6342,19 +6234,68 @@
if (packages == null) {
break;
}
- final List<String> packagesHandled = new ArrayList<>();
- for (int i = packages.length - 1; i >= 0; i--) {
- final String packageName = packages[i];
- if (updateLatestCachedApkFromAMS(packageName, null, true)) {
- hasPkgInfo = true;
- packagesHandled.add(packageName);
+
+ List<String> packagesHandled = new ArrayList<>();
+
+ synchronized (mResourcesManager) {
+ for (int i = packages.length - 1; i >= 0; i--) {
+ String packageName = packages[i];
+ WeakReference<LoadedApk> ref = mPackages.get(packageName);
+ LoadedApk pkgInfo = ref != null ? ref.get() : null;
+ if (pkgInfo != null) {
+ hasPkgInfo = true;
+ } else {
+ ref = mResourcePackages.get(packageName);
+ pkgInfo = ref != null ? ref.get() : null;
+ if (pkgInfo != null) {
+ hasPkgInfo = true;
+ }
+ }
+ // If the package is being replaced, yet it still has a valid
+ // LoadedApk object, the package was updated with _DONT_KILL.
+ // Adjust it's internal references to the application info and
+ // resources.
+ if (pkgInfo != null) {
+ packagesHandled.add(packageName);
+ try {
+ final ApplicationInfo aInfo =
+ sPackageManager.getApplicationInfo(
+ packageName,
+ PackageManager.GET_SHARED_LIBRARY_FILES,
+ UserHandle.myUserId());
+
+ if (mActivities.size() > 0) {
+ for (ActivityClientRecord ar : mActivities.values()) {
+ if (ar.activityInfo.applicationInfo.packageName
+ .equals(packageName)) {
+ ar.activityInfo.applicationInfo = aInfo;
+ ar.packageInfo = pkgInfo;
+ }
+ }
+ }
+
+ final String[] oldResDirs = { pkgInfo.getResDir() };
+
+ final ArrayList<String> oldPaths = new ArrayList<>();
+ LoadedApk.makePaths(this, pkgInfo.getApplicationInfo(), oldPaths);
+ pkgInfo.updateApplicationInfo(aInfo, oldPaths);
+
+ synchronized (mResourcesManager) {
+ // Update affected Resources objects to use new ResourcesImpl
+ mResourcesManager.applyNewResourceDirs(aInfo, oldResDirs);
+ }
+ } catch (RemoteException e) {
+ }
+ }
}
}
+
try {
getPackageManager().notifyPackagesReplacedReceived(
packagesHandled.toArray(new String[0]));
} catch (RemoteException ignored) {
}
+
break;
}
}
@@ -6913,7 +6854,7 @@
ii.copyTo(instrApp);
instrApp.initForUser(UserHandle.myUserId());
final LoadedApk pi = getPackageInfo(instrApp, data.compatInfo,
- appContext.getClassLoader(), false, true, false, true);
+ appContext.getClassLoader(), false, true, false);
// The test context's op package name == the target app's op package name, because
// the app ops manager checks the op package name against the real calling UID,
diff --git a/core/java/android/app/AppOpsManagerInternal.java b/core/java/android/app/AppOpsManagerInternal.java
index 7c85df8..363b5a7 100644
--- a/core/java/android/app/AppOpsManagerInternal.java
+++ b/core/java/android/app/AppOpsManagerInternal.java
@@ -209,4 +209,10 @@
*/
public abstract void setModeFromPermissionPolicy(int code, int uid, @NonNull String packageName,
int mode, @Nullable IAppOpsCallback callback);
+
+
+ /**
+ * Sets a global restriction on an op code.
+ */
+ public abstract void setGlobalRestriction(int code, boolean restricted, IBinder token);
}
diff --git a/core/java/android/app/ContextImpl.java b/core/java/android/app/ContextImpl.java
index d241968..16b6ea5 100644
--- a/core/java/android/app/ContextImpl.java
+++ b/core/java/android/app/ContextImpl.java
@@ -48,6 +48,7 @@
import android.content.pm.ApplicationInfo;
import android.content.pm.IPackageManager;
import android.content.pm.PackageManager;
+import android.content.pm.PackageManager.ApplicationInfoFlags;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.res.AssetManager;
import android.content.res.CompatResources;
@@ -2461,7 +2462,7 @@
public Context createApplicationContext(ApplicationInfo application, int flags)
throws NameNotFoundException {
LoadedApk pi = mMainThread.getPackageInfo(application, mResources.getCompatibilityInfo(),
- flags | CONTEXT_REGISTER_PACKAGE, false);
+ flags | CONTEXT_REGISTER_PACKAGE);
if (pi != null) {
ContextImpl c = new ContextImpl(this, mMainThread, pi, ContextParams.EMPTY,
mAttributionSource.getAttributionTag(),
@@ -2493,6 +2494,13 @@
@Override
public Context createPackageContextAsUser(String packageName, int flags, UserHandle user)
throws NameNotFoundException {
+ return createPackageContextAsUser(packageName, flags, user, 0 /* packageFlags */);
+ }
+
+ @Override
+ public Context createPackageContextAsUser(
+ @NonNull String packageName, @CreatePackageOptions int flags, @NonNull UserHandle user,
+ @ApplicationInfoFlags int packageFlags) throws PackageManager.NameNotFoundException {
if (packageName.equals("system") || packageName.equals("android")) {
// The system resources are loaded in every application, so we can safely copy
// the context without reloading Resources.
@@ -2503,7 +2511,7 @@
}
LoadedApk pi = mMainThread.getPackageInfo(packageName, mResources.getCompatibilityInfo(),
- flags | CONTEXT_REGISTER_PACKAGE, user.getIdentifier());
+ flags | CONTEXT_REGISTER_PACKAGE, user.getIdentifier(), packageFlags);
if (pi != null) {
ContextImpl c = new ContextImpl(this, mMainThread, pi, mParams,
mAttributionSource.getAttributionTag(),
diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java
index 6454d20..506dfe0 100644
--- a/core/java/android/app/Notification.java
+++ b/core/java/android/app/Notification.java
@@ -6344,10 +6344,11 @@
ApplicationInfo applicationInfo = n.extras.getParcelable(
EXTRA_BUILDER_APPLICATION_INFO);
Context builderContext;
- if (applicationInfo != null) {
+ if (applicationInfo != null && applicationInfo.packageName != null) {
try {
- builderContext = context.createApplicationContext(applicationInfo,
- Context.CONTEXT_RESTRICTED);
+ builderContext = context.createPackageContextAsUser(applicationInfo.packageName,
+ Context.CONTEXT_RESTRICTED,
+ UserHandle.getUserHandleForUid(applicationInfo.uid));
} catch (NameNotFoundException e) {
Log.e(TAG, "ApplicationInfo " + applicationInfo + " not found");
builderContext = context; // try with our context
diff --git a/core/java/android/app/ResourcesManager.java b/core/java/android/app/ResourcesManager.java
index dfd1e2b..e469b1f 100644
--- a/core/java/android/app/ResourcesManager.java
+++ b/core/java/android/app/ResourcesManager.java
@@ -98,12 +98,6 @@
private int mResDisplayId = DEFAULT_DISPLAY;
/**
- * ApplicationInfo changes that need to be applied to Resources when the next configuration
- * change occurs.
- */
- private ArrayList<ApplicationInfo> mPendingAppInfoUpdates;
-
- /**
* A mapping of ResourceImpls and their configurations. These are heavy weight objects
* which should be reused as much as possible.
*/
@@ -994,7 +988,7 @@
* @param classLoader The classloader to use for the Resources object.
* If null, {@link ClassLoader#getSystemClassLoader()} is used.
* @return A Resources object that gets updated when
- * {@link #applyConfigurationToResources(Configuration, CompatibilityInfo)}
+ * {@link #applyConfigurationToResourcesLocked(Configuration, CompatibilityInfo)}
* is called.
*/
@Nullable
@@ -1121,8 +1115,8 @@
/**
* Updates an Activity's Resources object with overrideConfig. The Resources object
* that was previously returned by {@link #getResources(IBinder, String, String[], String[],
- * String[], String[], Integer, Configuration, CompatibilityInfo, ClassLoader, List)} is still
- * valid and will have the updated configuration.
+ * String[], Integer, Configuration, CompatibilityInfo, ClassLoader, List)} is still valid and
+ * will have the updated configuration.
*
* @param activityToken The Activity token.
* @param overrideConfig The configuration override to update.
@@ -1273,22 +1267,6 @@
return newKey;
}
- public void updatePendingAppInfoUpdates(@NonNull ApplicationInfo appInfo) {
- synchronized (mLock) {
- if (mPendingAppInfoUpdates == null) {
- mPendingAppInfoUpdates = new ArrayList<>();
- }
- // Clear previous app info changes for the package to prevent multiple ResourcesImpl
- // recreations when only the last recreation will be used.
- for (int i = mPendingAppInfoUpdates.size() - 1; i >= 0; i--) {
- if (appInfo.sourceDir.equals(mPendingAppInfoUpdates.get(i).sourceDir)) {
- mPendingAppInfoUpdates.remove(i);
- }
- }
- mPendingAppInfoUpdates.add(appInfo);
- }
- }
-
public final boolean applyConfigurationToResources(@NonNull Configuration config,
@Nullable CompatibilityInfo compat) {
return applyConfigurationToResources(config, compat, null /* adjustments */);
@@ -1302,18 +1280,7 @@
Trace.traceBegin(Trace.TRACE_TAG_RESOURCES,
"ResourcesManager#applyConfigurationToResources");
- final boolean assetsUpdated = mPendingAppInfoUpdates != null
- && config.assetsSeq > mResConfiguration.assetsSeq;
- if (assetsUpdated) {
- for (int i = 0, n = mPendingAppInfoUpdates.size(); i < n; i++) {
- final ApplicationInfo appInfo = mPendingAppInfoUpdates.get(i);
- applyNewResourceDirs(appInfo, new String[]{appInfo.sourceDir});
- }
- mPendingAppInfoUpdates = null;
- }
-
- if (!assetsUpdated && !mResConfiguration.isOtherSeqNewer(config)
- && compat == null) {
+ if (!mResConfiguration.isOtherSeqNewer(config) && compat == null) {
if (DEBUG || DEBUG_CONFIGURATION) {
Slog.v(TAG, "Skipping new config: curSeq="
+ mResConfiguration.seq + ", newSeq=" + config.seq);
@@ -1353,7 +1320,7 @@
}
}
- return assetsUpdated || changes != 0;
+ return changes != 0;
} finally {
Trace.traceEnd(Trace.TRACE_TAG_RESOURCES);
}
diff --git a/core/java/android/appwidget/AppWidgetHostView.java b/core/java/android/appwidget/AppWidgetHostView.java
index ba3fc1e..3b11a19 100644
--- a/core/java/android/appwidget/AppWidgetHostView.java
+++ b/core/java/android/appwidget/AppWidgetHostView.java
@@ -37,6 +37,7 @@
import android.os.Bundle;
import android.os.CancellationSignal;
import android.os.Parcelable;
+import android.os.UserHandle;
import android.util.AttributeSet;
import android.util.Log;
import android.util.Pair;
@@ -718,9 +719,10 @@
protected Context getRemoteContext() {
try {
// Return if cloned successfully, otherwise default
- Context newContext = mContext.createApplicationContext(
- mInfo.providerInfo.applicationInfo,
- Context.CONTEXT_RESTRICTED);
+ final ApplicationInfo info = mInfo.providerInfo.applicationInfo;
+ Context newContext = mContext.createPackageContextAsUser(info.packageName,
+ Context.CONTEXT_RESTRICTED,
+ UserHandle.getUserHandleForUid(info.uid));
if (mColorResources != null) {
mColorResources.apply(newContext);
}
diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java
index c02dcfd..9c60f43 100644
--- a/core/java/android/content/Context.java
+++ b/core/java/android/content/Context.java
@@ -46,6 +46,7 @@
import android.compat.annotation.UnsupportedAppUsage;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
+import android.content.pm.PackageManager.ApplicationInfoFlags;
import android.content.res.AssetManager;
import android.content.res.ColorStateList;
import android.content.res.Configuration;
@@ -6268,6 +6269,23 @@
}
/**
+ * Similar to {@link #createPackageContextAsUser(String, int, UserHandle)}, but also allows
+ * specifying the flags used to retrieve the {@link ApplicationInfo} of the package.
+ *
+ * @hide
+ */
+ @NonNull
+ public Context createPackageContextAsUser(
+ @NonNull String packageName, @CreatePackageOptions int flags, @NonNull UserHandle user,
+ @ApplicationInfoFlags int packageFlags)
+ throws PackageManager.NameNotFoundException {
+ if (Build.IS_ENG) {
+ throw new IllegalStateException("createPackageContextAsUser not overridden!");
+ }
+ return this;
+ }
+
+ /**
* Similar to {@link #createPackageContext(String, int)}, but for the own package with a
* different {@link UserHandle}. For example, {@link #getContentResolver()}
* will open any {@link Uri} as the given user.
@@ -6286,10 +6304,18 @@
/**
* Creates a context given an {@link android.content.pm.ApplicationInfo}.
*
+ * @deprecated use {@link #createPackageContextAsUser(String, int, UserHandle, int)}
+ * If an application caches an ApplicationInfo and uses it to call this method,
+ * the app will not get the most recent version of Runtime Resource Overlays for
+ * that application. To make things worse, the LoadedApk stored in
+ * {@code ActivityThread#mResourcePackages} is updated using the old ApplicationInfo
+ * causing further uses of the cached LoadedApk to return outdated information.
+ *
* @hide
*/
@SuppressWarnings("HiddenAbstractMethod")
@UnsupportedAppUsage
+ @Deprecated
public abstract Context createApplicationContext(ApplicationInfo application,
@CreatePackageOptions int flags) throws PackageManager.NameNotFoundException;
diff --git a/core/java/android/content/ContextWrapper.java b/core/java/android/content/ContextWrapper.java
index 6324d0e..cf0dc8c 100644
--- a/core/java/android/content/ContextWrapper.java
+++ b/core/java/android/content/ContextWrapper.java
@@ -1009,6 +1009,14 @@
/** @hide */
@Override
+ public Context createPackageContextAsUser(String packageName, int flags, UserHandle user,
+ int packageFlags)
+ throws PackageManager.NameNotFoundException {
+ return mBase.createPackageContextAsUser(packageName, flags, user, packageFlags);
+ }
+
+ /** @hide */
+ @Override
public Context createContextAsUser(UserHandle user, @CreatePackageOptions int flags) {
return mBase.createContextAsUser(user, flags);
}
diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java
index 688483a..9e35a32 100644
--- a/core/java/android/content/Intent.java
+++ b/core/java/android/content/Intent.java
@@ -5736,12 +5736,20 @@
public static final String EXTRA_REPLACING = "android.intent.extra.REPLACING";
/**
- * Used as an int extra field in {@link android.app.AlarmManager} intents
+ * Used as an int extra field in {@link android.app.AlarmManager} pending intents
* to tell the application being invoked how many pending alarms are being
- * delievered with the intent. For one-shot alarms this will always be 1.
+ * delivered with the intent. For one-shot alarms this will always be 1.
* For recurring alarms, this might be greater than 1 if the device was
* asleep or powered off at the time an earlier alarm would have been
* delivered.
+ *
+ * <p>Note: You must supply a <b>mutable</b> {@link android.app.PendingIntent} to
+ * {@code AlarmManager} while setting your alarms to be able to read this value on receiving
+ * them. <em>Mutability of pending intents must be explicitly specified by apps targeting
+ * {@link Build.VERSION_CODES#S} or higher</em>.
+ *
+ * @see android.app.PendingIntent#FLAG_MUTABLE
+ *
*/
public static final String EXTRA_ALARM_COUNT = "android.intent.extra.ALARM_COUNT";
diff --git a/core/java/android/content/pm/PackageInstaller.java b/core/java/android/content/pm/PackageInstaller.java
index 75dd9fb..3f8aedb 100644
--- a/core/java/android/content/pm/PackageInstaller.java
+++ b/core/java/android/content/pm/PackageInstaller.java
@@ -2111,28 +2111,28 @@
* <p>
* Defaults to {@link #USER_ACTION_UNSPECIFIED} unless otherwise set. When unspecified for
* installers using the
- * {@link android.Manifest.permission#REQUEST_INSTALL_PACKAGES android.permission
- * #REQUEST_INSTALL_PACKAGES} permission will behave as if set to
- * {@link #USER_ACTION_REQUIRED}, and {@link #USER_ACTION_NOT_REQUIRED} otherwise.
- * When {@code requireUserAction} is set to {@link #USER_ACTION_REQUIRED}, installers will
- * receive a {@link #STATUS_PENDING_USER_ACTION} callback once the session is committed,
- * indicating that user action is required for the install to proceed.
+ * {@link android.Manifest.permission#REQUEST_INSTALL_PACKAGES REQUEST_INSTALL_PACKAGES}
+ * permission will behave as if set to {@link #USER_ACTION_REQUIRED}, and
+ * {@link #USER_ACTION_NOT_REQUIRED} otherwise. When {@code requireUserAction} is set to
+ * {@link #USER_ACTION_REQUIRED}, installers will receive a
+ * {@link #STATUS_PENDING_USER_ACTION} callback once the session is committed, indicating
+ * that user action is required for the install to proceed.
* <p>
* For installers that have been granted the
- * {@link android.Manifest.permission#REQUEST_INSTALL_PACKAGES android.permission
- * .REQUEST_INSTALL_PACKAGES} permission, user action will not be required when all of
- * the following conditions are met:
+ * {@link android.Manifest.permission#REQUEST_INSTALL_PACKAGES REQUEST_INSTALL_PACKAGES}
+ * permission, user action will not be required when all of the following conditions are
+ * met:
*
* <ul>
* <li>{@code requireUserAction} is set to {@link #USER_ACTION_NOT_REQUIRED}.</li>
* <li>The app being installed targets {@link android.os.Build.VERSION_CODES#Q API 29}
* or higher.</li>
* <li>The installer is the {@link InstallSourceInfo#getInstallingPackageName()
- * installer of record} of an existing version of the app (i.e.: this install session
- * is an app update) or the installer is updating itself.</li>
+ * installer of record} of an existing version of the app (in other words, this install
+ * session is an app update) or the installer is updating itself.</li>
* <li>The installer declares the
- * {@link android.Manifest.permission#UPDATE_PACKAGES_WITHOUT_USER_ACTION android
- * .permission.UPDATE_PACKAGES_WITHOUT_USER_ACTION} permission.</li>
+ * {@link android.Manifest.permission#UPDATE_PACKAGES_WITHOUT_USER_ACTION
+ * UPDATE_PACKAGES_WITHOUT_USER_ACTION} permission.</li>
* </ul>
* <p>
* Note: The target API level requirement will advance in future Android versions.
diff --git a/core/java/android/content/pm/PackageItemInfo.java b/core/java/android/content/pm/PackageItemInfo.java
index 65ce1e7..dd2080b 100644
--- a/core/java/android/content/pm/PackageItemInfo.java
+++ b/core/java/android/content/pm/PackageItemInfo.java
@@ -61,7 +61,7 @@
public static final int MAX_SAFE_LABEL_LENGTH = 1000;
/** @hide */
- public static final float DEFAULT_MAX_LABEL_SIZE_PX = 500f;
+ public static final float DEFAULT_MAX_LABEL_SIZE_PX = 1000f;
/**
* Remove {@link Character#isWhitespace(int) whitespace} and non-breaking spaces from the edges
diff --git a/core/java/android/content/pm/TEST_MAPPING b/core/java/android/content/pm/TEST_MAPPING
index 1eb4504..8bc3734 100644
--- a/core/java/android/content/pm/TEST_MAPPING
+++ b/core/java/android/content/pm/TEST_MAPPING
@@ -49,9 +49,6 @@
"include-filter": "android.appsecurity.cts.AppSecurityTests#testPermissionDiffCert"
}
]
- },
- {
- "name": "CtsPackageManagerBootTestCases"
}
]
}
diff --git a/core/java/android/service/notification/StatusBarNotification.java b/core/java/android/service/notification/StatusBarNotification.java
index 8e4a68e..863d71f 100644
--- a/core/java/android/service/notification/StatusBarNotification.java
+++ b/core/java/android/service/notification/StatusBarNotification.java
@@ -434,11 +434,8 @@
public Context getPackageContext(Context context) {
if (mContext == null) {
try {
- ApplicationInfo ai = context.getPackageManager()
- .getApplicationInfoAsUser(pkg, PackageManager.MATCH_UNINSTALLED_PACKAGES,
- getUserId());
- mContext = context.createApplicationContext(ai,
- Context.CONTEXT_RESTRICTED);
+ mContext = context.createPackageContextAsUser(pkg, Context.CONTEXT_RESTRICTED, user,
+ PackageManager.MATCH_UNINSTALLED_PACKAGES);
} catch (PackageManager.NameNotFoundException e) {
mContext = null;
}
diff --git a/core/java/android/service/wallpaper/WallpaperService.java b/core/java/android/service/wallpaper/WallpaperService.java
index a88d5b9..fe1fcfc 100644
--- a/core/java/android/service/wallpaper/WallpaperService.java
+++ b/core/java/android/service/wallpaper/WallpaperService.java
@@ -20,6 +20,7 @@
import static android.graphics.Matrix.MSCALE_Y;
import static android.graphics.Matrix.MSKEW_X;
import static android.graphics.Matrix.MSKEW_Y;
+import static android.view.SurfaceControl.METADATA_WINDOW_TYPE;
import static android.view.View.SYSTEM_UI_FLAG_VISIBLE;
import static android.view.WindowManager.LayoutParams.TYPE_WALLPAPER;
@@ -1024,6 +1025,8 @@
mBbqSurfaceControl = new SurfaceControl.Builder()
.setName("Wallpaper BBQ wrapper")
.setHidden(false)
+ // TODO(b/192291754)
+ .setMetadata(METADATA_WINDOW_TYPE, TYPE_WALLPAPER)
.setBLASTLayer()
.setParent(mSurfaceControl)
.setCallsite("Wallpaper#relayout")
diff --git a/core/java/android/telephony/PhoneStateListener.java b/core/java/android/telephony/PhoneStateListener.java
index a1ffe34..d39b56d 100644
--- a/core/java/android/telephony/PhoneStateListener.java
+++ b/core/java/android/telephony/PhoneStateListener.java
@@ -621,7 +621,11 @@
* The instance of {@link ServiceState} passed as an argument here will have various levels of
* location information stripped from it depending on the location permissions that your app
* holds. Only apps holding the {@link Manifest.permission#ACCESS_FINE_LOCATION} permission will
- * receive all the information in {@link ServiceState}.
+ * receive all the information in {@link ServiceState}, otherwise the cellIdentity will be null
+ * if apps only holding the {@link Manifest.permission#ACCESS_COARSE_LOCATION} permission.
+ * Network operator name in long/short alphanumeric format and numeric id will be null if apps
+ * holding neither {@link android.Manifest.permission#ACCESS_FINE_LOCATION} nor
+ * {@link android.Manifest.permission#ACCESS_COARSE_LOCATION}.
*
* @see ServiceState#STATE_EMERGENCY_ONLY
* @see ServiceState#STATE_IN_SERVICE
diff --git a/core/java/android/telephony/TelephonyCallback.java b/core/java/android/telephony/TelephonyCallback.java
index 1a25c8b..dd4de0a 100644
--- a/core/java/android/telephony/TelephonyCallback.java
+++ b/core/java/android/telephony/TelephonyCallback.java
@@ -663,7 +663,12 @@
* levels of location information stripped from it depending on the location permissions
* that your app holds.
* Only apps holding the {@link Manifest.permission#ACCESS_FINE_LOCATION} permission will
- * receive all the information in {@link ServiceState}.
+ * receive all the information in {@link ServiceState}, otherwise the cellIdentity
+ * will be null if apps only holding the {@link Manifest.permission#ACCESS_COARSE_LOCATION}
+ * permission.
+ * Network operator name in long/short alphanumeric format and numeric id will be null if
+ * apps holding neither {@link android.Manifest.permission#ACCESS_FINE_LOCATION} nor
+ * {@link android.Manifest.permission#ACCESS_COARSE_LOCATION}.
*
* @see ServiceState#STATE_EMERGENCY_ONLY
* @see ServiceState#STATE_IN_SERVICE
diff --git a/core/java/android/view/WindowManager.java b/core/java/android/view/WindowManager.java
index 5964f63..2996c3d 100644
--- a/core/java/android/view/WindowManager.java
+++ b/core/java/android/view/WindowManager.java
@@ -3781,6 +3781,7 @@
out.writeInt(screenOrientation);
out.writeFloat(preferredRefreshRate);
out.writeInt(preferredDisplayModeId);
+ out.writeFloat(preferredMaxDisplayRefreshRate);
out.writeInt(systemUiVisibility);
out.writeInt(subtreeSystemUiVisibility);
out.writeBoolean(hasSystemUiListeners);
@@ -3851,6 +3852,7 @@
screenOrientation = in.readInt();
preferredRefreshRate = in.readFloat();
preferredDisplayModeId = in.readInt();
+ preferredMaxDisplayRefreshRate = in.readFloat();
systemUiVisibility = in.readInt();
subtreeSystemUiVisibility = in.readInt();
hasSystemUiListeners = in.readBoolean();
@@ -3928,6 +3930,8 @@
public static final int MINIMAL_POST_PROCESSING_PREFERENCE_CHANGED = 1 << 28;
/** {@hide} */
public static final int BLUR_BEHIND_RADIUS_CHANGED = 1 << 29;
+ /** {@hide} */
+ public static final int PREFERRED_MAX_DISPLAY_REFRESH_RATE = 1 << 30;
// internal buffer to backup/restore parameters under compatibility mode.
private int[] mCompatibilityParamsBackup = null;
@@ -4059,6 +4063,11 @@
changes |= PREFERRED_DISPLAY_MODE_ID;
}
+ if (preferredMaxDisplayRefreshRate != o.preferredMaxDisplayRefreshRate) {
+ preferredMaxDisplayRefreshRate = o.preferredMaxDisplayRefreshRate;
+ changes |= PREFERRED_MAX_DISPLAY_REFRESH_RATE;
+ }
+
if (systemUiVisibility != o.systemUiVisibility
|| subtreeSystemUiVisibility != o.subtreeSystemUiVisibility) {
systemUiVisibility = o.systemUiVisibility;
@@ -4263,6 +4272,10 @@
sb.append(" preferredDisplayMode=");
sb.append(preferredDisplayModeId);
}
+ if (preferredMaxDisplayRefreshRate != 0) {
+ sb.append(" preferredMaxDisplayRefreshRate=");
+ sb.append(preferredMaxDisplayRefreshRate);
+ }
if (hasSystemUiListeners) {
sb.append(" sysuil=");
sb.append(hasSystemUiListeners);
diff --git a/core/java/android/view/contentcapture/MainContentCaptureSession.java b/core/java/android/view/contentcapture/MainContentCaptureSession.java
index e0a7bf2..4cf5532 100644
--- a/core/java/android/view/contentcapture/MainContentCaptureSession.java
+++ b/core/java/android/view/contentcapture/MainContentCaptureSession.java
@@ -773,7 +773,7 @@
void notifyContextUpdated(int sessionId, @Nullable ContentCaptureContext context) {
mHandler.post(() -> sendEvent(new ContentCaptureEvent(sessionId, TYPE_CONTEXT_UPDATED)
- .setClientContext(context)));
+ .setClientContext(context), FORCE_FLUSH));
}
@Override
diff --git a/core/java/android/webkit/WebViewFactory.java b/core/java/android/webkit/WebViewFactory.java
index cf6807e..8d27cde 100644
--- a/core/java/android/webkit/WebViewFactory.java
+++ b/core/java/android/webkit/WebViewFactory.java
@@ -33,6 +33,7 @@
import android.os.ServiceManager;
import android.os.SystemClock;
import android.os.Trace;
+import android.os.UserHandle;
import android.util.AndroidRuntimeException;
import android.util.ArraySet;
import android.util.Log;
@@ -467,9 +468,12 @@
sTimestamps.mCreateContextStart = SystemClock.uptimeMillis();
try {
// Construct an app context to load the Java code into the current app.
- Context webViewContext = initialApplication.createApplicationContext(
- ai,
- Context.CONTEXT_INCLUDE_CODE | Context.CONTEXT_IGNORE_SECURITY);
+ Context webViewContext = initialApplication.createPackageContextAsUser(
+ ai.packageName,
+ Context.CONTEXT_INCLUDE_CODE | Context.CONTEXT_IGNORE_SECURITY,
+ UserHandle.getUserHandleForUid(ai.uid),
+ PackageManager.MATCH_UNINSTALLED_PACKAGES
+ | PackageManager.MATCH_DEBUG_TRIAGED_MISSING);
sPackageInfo = newPackageInfo;
return webViewContext;
} finally {
diff --git a/core/java/android/widget/RemoteViews.java b/core/java/android/widget/RemoteViews.java
index e827f0a..8a044fd 100644
--- a/core/java/android/widget/RemoteViews.java
+++ b/core/java/android/widget/RemoteViews.java
@@ -5831,8 +5831,9 @@
return context;
}
try {
- return context.createApplicationContext(mApplication,
- Context.CONTEXT_RESTRICTED);
+ return context.createPackageContextAsUser(mApplication.packageName,
+ Context.CONTEXT_RESTRICTED,
+ UserHandle.getUserHandleForUid(mApplication.uid));
} catch (NameNotFoundException e) {
Log.e(LOG_TAG, "Package name " + mApplication.packageName + " not found");
}
diff --git a/core/java/android/widget/SelectionActionModeHelper.java b/core/java/android/widget/SelectionActionModeHelper.java
index eb6bce4..3fed9be 100644
--- a/core/java/android/widget/SelectionActionModeHelper.java
+++ b/core/java/android/widget/SelectionActionModeHelper.java
@@ -565,6 +565,7 @@
*/
public void onSmartSelection(SelectionResult result) {
onClassifiedSelection(result);
+ mTextView.notifyContentCaptureTextChanged();
mLogger.logSelectionModified(
result.mStart, result.mEnd, result.mClassification, result.mSelection);
}
@@ -595,6 +596,7 @@
mSelectionStart = selectionStart;
mSelectionEnd = selectionEnd;
mAllowReset = false;
+ mTextView.notifyContentCaptureTextChanged();
mLogger.logSelectionModified(selectionStart, selectionEnd, classification, null);
}
}
diff --git a/core/java/com/android/internal/app/IAppOpsService.aidl b/core/java/com/android/internal/app/IAppOpsService.aidl
index 9ad4572..30da4b4 100644
--- a/core/java/com/android/internal/app/IAppOpsService.aidl
+++ b/core/java/com/android/internal/app/IAppOpsService.aidl
@@ -97,6 +97,7 @@
void setUserRestrictions(in Bundle restrictions, IBinder token, int userHandle);
void setUserRestriction(int code, boolean restricted, IBinder token, int userHandle, in PackageTagsList excludedPackageTags);
+
void removeUser(int userHandle);
void startWatchingActive(in int[] ops, IAppOpsActiveCallback callback);
diff --git a/core/java/com/android/internal/os/ZygoteInit.java b/core/java/com/android/internal/os/ZygoteInit.java
index 6ff656c..0f26f57e 100644
--- a/core/java/com/android/internal/os/ZygoteInit.java
+++ b/core/java/com/android/internal/os/ZygoteInit.java
@@ -127,6 +127,12 @@
private static boolean sPreloadComplete;
+ /**
+ * Cached classloader to use for the system server. Will only be populated in the system
+ * server process.
+ */
+ private static ClassLoader sCachedSystemServerClassLoader = null;
+
static void preload(TimingsTraceLog bootTimingsTraceLog) {
Log.d(TAG, "begin preload");
bootTimingsTraceLog.traceBegin("BeginPreload");
@@ -540,10 +546,8 @@
throw new IllegalStateException("Unexpected return from WrapperInit.execApplication");
} else {
- ClassLoader cl = null;
- if (systemServerClasspath != null) {
- cl = createPathClassLoader(systemServerClasspath, parsedArgs.mTargetSdkVersion);
-
+ ClassLoader cl = getOrCreateSystemServerClassLoader();
+ if (cl != null) {
Thread.currentThread().setContextClassLoader(cl);
}
@@ -559,6 +563,23 @@
}
/**
+ * Create the classloader for the system server and store it in
+ * {@link sCachedSystemServerClassLoader}. This function may be called through JNI in
+ * system server startup, when the runtime is in a critically low state. Do not do
+ * extended computation etc here.
+ */
+ private static ClassLoader getOrCreateSystemServerClassLoader() {
+ if (sCachedSystemServerClassLoader == null) {
+ final String systemServerClasspath = Os.getenv("SYSTEMSERVERCLASSPATH");
+ if (systemServerClasspath != null) {
+ sCachedSystemServerClassLoader = createPathClassLoader(systemServerClasspath,
+ VMRuntime.SDK_VERSION_CUR_DEVELOPMENT);
+ }
+ }
+ return sCachedSystemServerClassLoader;
+ }
+
+ /**
* Note that preparing the profiles for system server does not require special selinux
* permissions. From the installer perspective the system server is a regular package which can
* capture profile information.
diff --git a/core/jni/com_android_internal_os_Zygote.cpp b/core/jni/com_android_internal_os_Zygote.cpp
index 502849e..64bf47c 100644
--- a/core/jni/com_android_internal_os_Zygote.cpp
+++ b/core/jni/com_android_internal_os_Zygote.cpp
@@ -122,6 +122,10 @@
static jmethodID gCallPostForkSystemServerHooks;
static jmethodID gCallPostForkChildHooks;
+static constexpr const char* kZygoteInitClassName = "com/android/internal/os/ZygoteInit";
+static jclass gZygoteInitClass;
+static jmethodID gGetOrCreateSystemServerClassLoader;
+
static bool gIsSecurityEnforced = true;
/**
@@ -170,6 +174,7 @@
static constexpr const uint64_t LOWER_HALF_WORD_MASK = 0x0000'0000'FFFF'FFFF;
static constexpr const char* kCurProfileDirPath = "/data/misc/profiles/cur";
+static constexpr const char* kRefProfileDirPath = "/data/misc/profiles/ref";
/**
* The maximum value that the gUSAPPoolSizeMax variable may take. This value
@@ -1433,6 +1438,7 @@
// Mount (namespace) tmpfs on profile directory, so apps no longer access
// the original profile directory anymore.
MountAppDataTmpFs(kCurProfileDirPath, fail_fn);
+ MountAppDataTmpFs(kRefProfileDirPath, fail_fn);
// Create profile directory for this user.
std::string actualCurUserProfile = StringPrintf("%s/%d", kCurProfileDirPath, user_id);
@@ -1446,14 +1452,24 @@
packageName.c_str());
std::string mirrorCurPackageProfile = StringPrintf("/data_mirror/cur_profiles/%d/%s",
user_id, packageName.c_str());
+ std::string actualRefPackageProfile = StringPrintf("%s/%s", kRefProfileDirPath,
+ packageName.c_str());
+ std::string mirrorRefPackageProfile = StringPrintf("/data_mirror/ref_profiles/%s",
+ packageName.c_str());
if (access(mirrorCurPackageProfile.c_str(), F_OK) != 0) {
ALOGW("Can't access app profile directory: %s", mirrorCurPackageProfile.c_str());
continue;
}
+ if (access(mirrorRefPackageProfile.c_str(), F_OK) != 0) {
+ ALOGW("Can't access app profile directory: %s", mirrorRefPackageProfile.c_str());
+ continue;
+ }
PrepareDir(actualCurPackageProfile, DEFAULT_DATA_DIR_PERMISSION, uid, uid, fail_fn);
BindMount(mirrorCurPackageProfile, actualCurPackageProfile, fail_fn);
+ PrepareDir(actualRefPackageProfile, DEFAULT_DATA_DIR_PERMISSION, uid, uid, fail_fn);
+ BindMount(mirrorRefPackageProfile, actualRefPackageProfile, fail_fn);
}
}
@@ -1613,6 +1629,17 @@
instruction_set.value().c_str());
}
+ if (is_system_server) {
+ // Prefetch the classloader for the system server. This is done early to
+ // allow a tie-down of the proper system server selinux domain.
+ env->CallStaticObjectMethod(gZygoteInitClass, gGetOrCreateSystemServerClassLoader);
+ if (env->ExceptionCheck()) {
+ // Be robust here. The Java code will attempt to create the classloader
+ // at a later point (but may not have rights to use AoT artifacts).
+ env->ExceptionClear();
+ }
+ }
+
if (setresgid(gid, gid, gid) == -1) {
fail_fn(CREATE_ERROR("setresgid(%d) failed: %s", gid, strerror(errno)));
}
@@ -2676,6 +2703,13 @@
gCallPostForkChildHooks = GetStaticMethodIDOrDie(env, gZygoteClass, "callPostForkChildHooks",
"(IZZLjava/lang/String;)V");
- return RegisterMethodsOrDie(env, "com/android/internal/os/Zygote", gMethods, NELEM(gMethods));
+ gZygoteInitClass = MakeGlobalRefOrDie(env, FindClassOrDie(env, kZygoteInitClassName));
+ gGetOrCreateSystemServerClassLoader =
+ GetStaticMethodIDOrDie(env, gZygoteInitClass, "getOrCreateSystemServerClassLoader",
+ "()Ljava/lang/ClassLoader;");
+
+ RegisterMethodsOrDie(env, "com/android/internal/os/Zygote", gMethods, NELEM(gMethods));
+
+ return JNI_OK;
}
} // namespace android
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index 64b8a1a..14d200d 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -1663,11 +1663,6 @@
<permission android:name="android.permission.INSTALL_LOCATION_TIME_ZONE_PROVIDER_SERVICE"
android:protectionLevel="signature|privileged" />
- <!-- The system server uses this permission to install a default secondary location time zone
- provider.
- -->
- <uses-permission android:name="android.permission.INSTALL_LOCATION_TIME_ZONE_PROVIDER_SERVICE"/>
-
<!-- @SystemApi @hide Allows an application to bind to a android.service.TimeZoneProviderService
for the purpose of detecting the device's time zone. This prevents arbitrary clients
connecting to the time zone provider service. The system server checks that the provider's
@@ -5809,10 +5804,6 @@
android:label="@string/sensor_notification_service"/>
<!-- Attribution for Twilight service. -->
<attribution android:tag="TwilightService" android:label="@string/twilight_service"/>
- <!-- Attribution for the Offline LocationTimeZoneProvider, used to detect time zone using
- on-device data -->
- <attribution android:tag="OfflineLocationTimeZoneProviderService"
- android:label="@string/offline_location_time_zone_detection_service_attribution"/>
<!-- Attribution for Gnss Time Update service. -->
<attribution android:tag="GnssTimeUpdateService"
android:label="@string/gnss_time_update_service"/>
@@ -6292,19 +6283,6 @@
</intent-filter>
</service>
- <!-- AOSP configures a default secondary LocationTimeZoneProvider that uses an on-device
- data set from the com.android.geotz APEX. -->
- <service android:name="com.android.timezone.location.provider.OfflineLocationTimeZoneProviderService"
- android:enabled="@bool/config_enableSecondaryLocationTimeZoneProvider"
- android:permission="android.permission.BIND_TIME_ZONE_PROVIDER_SERVICE"
- android:exported="false">
- <intent-filter>
- <action android:name="android.service.timezone.SecondaryLocationTimeZoneProviderService" />
- </intent-filter>
- <meta-data android:name="serviceVersion" android:value="1" />
- <meta-data android:name="serviceIsMultiuser" android:value="true" />
- </service>
-
<provider
android:name="com.android.server.textclassifier.IconsContentProvider"
android:authorities="com.android.textclassifier.icons"
diff --git a/core/res/res/values-bn/strings.xml b/core/res/res/values-bn/strings.xml
index 43a7d80..718eef0 100644
--- a/core/res/res/values-bn/strings.xml
+++ b/core/res/res/values-bn/strings.xml
@@ -613,10 +613,8 @@
</string-array>
<string name="fingerprint_icon_content_description" msgid="4741068463175388817">"আঙ্গুলের ছাপ আইকন"</string>
<string name="face_recalibrate_notification_name" msgid="7311163114750748686">"\'ফেস আনলক\'"</string>
- <!-- no translation found for face_recalibrate_notification_title (2524791952735579082) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_content (3064513770251355594) -->
- <skip />
+ <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"\'ফেস আনলক\' ফিচার ব্যবহার করার ক্ষেত্রে হওয়া সমস্যা"</string>
+ <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"আপনার ফেস মডেল মুছে দেওয়ার জন্য ট্যাপ করুন এবং তারপরে আবার ফেস যোগ করুন"</string>
<string name="face_setup_notification_title" msgid="8843461561970741790">"\'ফেস আনলক\' সেট আপ করুন"</string>
<string name="face_setup_notification_content" msgid="5463999831057751676">"আপনার ফোনের দিকে তাকিয়ে এটিকে আনলক করুন"</string>
<string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"আনলক করার জন্য বিভিন্ন উপায়ে সেট আপ করুন"</string>
diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml
index 5bf8273..1ec443e 100644
--- a/core/res/res/values-cs/strings.xml
+++ b/core/res/res/values-cs/strings.xml
@@ -608,8 +608,7 @@
<string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"Nejsou zaregistrovány žádné otisky prstů."</string>
<string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"Toto zařízení nemá snímač otisků prstů."</string>
<string name="fingerprint_error_security_update_required" msgid="7750187320640856433">"Senzor je dočasně deaktivován."</string>
- <!-- no translation found for fingerprint_error_bad_calibration (4385512597740168120) -->
- <skip />
+ <string name="fingerprint_error_bad_calibration" msgid="4385512597740168120">"Snímač otisků prstů nelze použít. Navštivte servis"</string>
<string name="fingerprint_name_template" msgid="8941662088160289778">"Prst <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string name="fingerprint_app_setting_name" msgid="4253767877095495844">"Použít otisk prstu"</string>
<string name="fingerprint_or_screen_lock_app_setting_name" msgid="3501743523487644907">"Použít otisk prstu nebo zámek obrazovky"</string>
@@ -625,12 +624,9 @@
<string name="face_setup_notification_content" msgid="5463999831057751676">"Telefon odemknete pohledem"</string>
<string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Nastavte si více způsobů odemykání"</string>
<string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Klepnutím přidáte otisk prstu"</string>
- <!-- no translation found for fingerprint_recalibrate_notification_name (1414578431898579354) -->
- <skip />
- <!-- no translation found for fingerprint_recalibrate_notification_title (2406561052064558497) -->
- <skip />
- <!-- no translation found for fingerprint_recalibrate_notification_content (8519935717822194943) -->
- <skip />
+ <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Odemknutí otiskem prstu"</string>
+ <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"Snímač otisků prstů nelze použít"</string>
+ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Navštivte servis"</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"Obličej se nepodařilo zachytit. Zkuste to znovu."</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"Je příliš světlo. Zmírněte osvětlení."</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"Je moc velká tma. Přejděte na světlo."</string>
diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml
index fee723d..e0bfb59 100644
--- a/core/res/res/values-da/strings.xml
+++ b/core/res/res/values-da/strings.xml
@@ -602,8 +602,7 @@
<string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"Der er ikke registreret nogen fingeraftryk."</string>
<string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"Denne enhed har ingen fingeraftrykslæser."</string>
<string name="fingerprint_error_security_update_required" msgid="7750187320640856433">"Sensoren er midlertidigt deaktiveret."</string>
- <!-- no translation found for fingerprint_error_bad_calibration (4385512597740168120) -->
- <skip />
+ <string name="fingerprint_error_bad_calibration" msgid="4385512597740168120">"Fingeraftrykslæseren kan ikke bruges. Få den repareret"</string>
<string name="fingerprint_name_template" msgid="8941662088160289778">"Fingeraftryk <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string name="fingerprint_app_setting_name" msgid="4253767877095495844">"Brug fingeraftryk"</string>
<string name="fingerprint_or_screen_lock_app_setting_name" msgid="3501743523487644907">"Brug fingeraftryk eller skærmlås"</string>
@@ -619,12 +618,9 @@
<string name="face_setup_notification_content" msgid="5463999831057751676">"Lås din telefon op ved at kigge på den"</string>
<string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Konfigurer flere måder at låse op på"</string>
<string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Tryk for at tilføje et fingeraftryk"</string>
- <!-- no translation found for fingerprint_recalibrate_notification_name (1414578431898579354) -->
- <skip />
- <!-- no translation found for fingerprint_recalibrate_notification_title (2406561052064558497) -->
- <skip />
- <!-- no translation found for fingerprint_recalibrate_notification_content (8519935717822194943) -->
- <skip />
+ <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Oplåsning med fingeraftryk"</string>
+ <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"Fingeraftrykslæseren kan ikke bruges"</string>
+ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Få den repareret."</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"Der blev ikke registreret ansigtsdata. Prøv igen."</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"Der er for lyst. Prøv en mere dæmpet belysning."</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"For mørkt. Prøv med mere belysning."</string>
diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml
index e0b3a8d..4105e266 100644
--- a/core/res/res/values-fa/strings.xml
+++ b/core/res/res/values-fa/strings.xml
@@ -602,8 +602,7 @@
<string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"اثر انگشتی ثبت نشده است."</string>
<string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"این دستگاه حسگر اثر انگشت ندارد."</string>
<string name="fingerprint_error_security_update_required" msgid="7750187320640856433">"حسگر بهطور موقت غیرفعال است."</string>
- <!-- no translation found for fingerprint_error_bad_calibration (4385512597740168120) -->
- <skip />
+ <string name="fingerprint_error_bad_calibration" msgid="4385512597740168120">"امکان استفاده از حسگر اثر انگشت وجود ندارد. به ارائهدهنده خدمات تعمیر مراجعه کنید"</string>
<string name="fingerprint_name_template" msgid="8941662088160289778">"انگشت <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string name="fingerprint_app_setting_name" msgid="4253767877095495844">"استفاده از اثر انگشت"</string>
<string name="fingerprint_or_screen_lock_app_setting_name" msgid="3501743523487644907">"استفاده از اثر انگشت یا قفل صفحه"</string>
@@ -619,12 +618,9 @@
<string name="face_setup_notification_content" msgid="5463999831057751676">"برای باز کردن قفل تلفن خود به آن نگاه کنید"</string>
<string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"راهاندازی روشهای بیشتر برای باز کردن قفل"</string>
<string name="fingerprint_setup_notification_content" msgid="205578121848324852">"برای افزودن اثر انگشت، ضربه بزنید"</string>
- <!-- no translation found for fingerprint_recalibrate_notification_name (1414578431898579354) -->
- <skip />
- <!-- no translation found for fingerprint_recalibrate_notification_title (2406561052064558497) -->
- <skip />
- <!-- no translation found for fingerprint_recalibrate_notification_content (8519935717822194943) -->
- <skip />
+ <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"قفلگشایی با اثر انگشت"</string>
+ <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"امکان استفاده از حسگر اثر انگشت وجود ندارد"</string>
+ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"به ارائهدهنده خدمات تعمیر مراجعه کنید."</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"دادههای دقیق چهره ضبط نشد. دوباره امتحان کنید."</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"خیلی روشن است. روشناییاش را ملایمتر کنید."</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"خیلی تاریک است. تصویر را روشنتر کنید."</string>
diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml
index c2414ac..cbf8d69 100644
--- a/core/res/res/values-fr-rCA/strings.xml
+++ b/core/res/res/values-fr-rCA/strings.xml
@@ -602,8 +602,7 @@
<string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"Aucune empreinte digitale enregistrée."</string>
<string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"Cet appareil ne possède pas de capteur d\'empreintes digitales."</string>
<string name="fingerprint_error_security_update_required" msgid="7750187320640856433">"Le capteur a été désactivé temporairement."</string>
- <!-- no translation found for fingerprint_error_bad_calibration (4385512597740168120) -->
- <skip />
+ <string name="fingerprint_error_bad_calibration" msgid="4385512597740168120">"Impossible utiliser capteur empreinte digitale. Consultez un fournisseur de services de réparation"</string>
<string name="fingerprint_name_template" msgid="8941662088160289778">"Doigt <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string name="fingerprint_app_setting_name" msgid="4253767877095495844">"Utiliser l\'empreinte digitale"</string>
<string name="fingerprint_or_screen_lock_app_setting_name" msgid="3501743523487644907">"Utiliser l\'empreinte digitale ou le verrouillage de l\'écran"</string>
@@ -613,20 +612,15 @@
</string-array>
<string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Icône d\'empreinte digitale"</string>
<string name="face_recalibrate_notification_name" msgid="7311163114750748686">"Déverrouillage par reconnaissance faciale"</string>
- <!-- no translation found for face_recalibrate_notification_title (2524791952735579082) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_content (3064513770251355594) -->
- <skip />
+ <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"Problème avec la fonctionnalité de déverrouillage par reconnaissance faciale"</string>
+ <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"Touchez pour supprimer votre modèle facial, puis ajoutez votre visage de nouveau"</string>
<string name="face_setup_notification_title" msgid="8843461561970741790">"Configurer le déverrouillage par reconnaissance faciale"</string>
<string name="face_setup_notification_content" msgid="5463999831057751676">"Déverrouillez votre téléphone en le regardant"</string>
<string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Configurer d\'autres méthodes de déverrouillage"</string>
<string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Touchez pour ajouter une empreinte digitale"</string>
- <!-- no translation found for fingerprint_recalibrate_notification_name (1414578431898579354) -->
- <skip />
- <!-- no translation found for fingerprint_recalibrate_notification_title (2406561052064558497) -->
- <skip />
- <!-- no translation found for fingerprint_recalibrate_notification_content (8519935717822194943) -->
- <skip />
+ <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Déverrouillage par empreinte digitale"</string>
+ <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"Impossible d\'utiliser le capteur d\'empreintes digitales"</string>
+ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Consultez un fournisseur de services de réparation."</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"Imposs. capt. données visage précises. Réessayez."</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"Trop lumineux. Essayez un éclairage plus faible."</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"Trop sombre. Essayez avec un éclairage plus fort."</string>
diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml
index c727b4f..157f01f 100644
--- a/core/res/res/values-gl/strings.xml
+++ b/core/res/res/values-gl/strings.xml
@@ -602,8 +602,7 @@
<string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"Non se rexistraron impresións dixitais."</string>
<string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"Este dispositivo non ten sensor de impresión dixital."</string>
<string name="fingerprint_error_security_update_required" msgid="7750187320640856433">"Desactivouse o sensor temporalmente."</string>
- <!-- no translation found for fingerprint_error_bad_calibration (4385512597740168120) -->
- <skip />
+ <string name="fingerprint_error_bad_calibration" msgid="4385512597740168120">"Non se puido usar o sensor de impresión dixital. Visita un provedor de reparacións"</string>
<string name="fingerprint_name_template" msgid="8941662088160289778">"Dedo <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string name="fingerprint_app_setting_name" msgid="4253767877095495844">"Utilizar impresión dixital"</string>
<string name="fingerprint_or_screen_lock_app_setting_name" msgid="3501743523487644907">"Utilizar impresión dixital ou credencial do dispositivo"</string>
@@ -619,12 +618,9 @@
<string name="face_setup_notification_content" msgid="5463999831057751676">"Mira o teléfono para desbloquealo"</string>
<string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Configura máis maneiras de desbloquear o dispositivo"</string>
<string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Toca para engadir unha impresión dixital"</string>
- <!-- no translation found for fingerprint_recalibrate_notification_name (1414578431898579354) -->
- <skip />
- <!-- no translation found for fingerprint_recalibrate_notification_title (2406561052064558497) -->
- <skip />
- <!-- no translation found for fingerprint_recalibrate_notification_content (8519935717822194943) -->
- <skip />
+ <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Desbloqueo mediante impresión dixital"</string>
+ <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"Non se puido usar o sensor de impresión dixital"</string>
+ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Visita un provedor de reparacións."</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"Sen datos faciais exactos. Téntao de novo."</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"Hai demasiada iluminación. Proba cunha máis suave."</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"Hai demasiada escuridade. Proba con máis luz."</string>
diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml
index 08699ec..1a4723c 100644
--- a/core/res/res/values-hu/strings.xml
+++ b/core/res/res/values-hu/strings.xml
@@ -602,8 +602,7 @@
<string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"Nincsenek regisztrált ujjlenyomatok."</string>
<string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"Ez az eszköz nem rendelkezik ujjlenyomat-érzékelővel."</string>
<string name="fingerprint_error_security_update_required" msgid="7750187320640856433">"Az érzékelő átmenetileg le van tiltva."</string>
- <!-- no translation found for fingerprint_error_bad_calibration (4385512597740168120) -->
- <skip />
+ <string name="fingerprint_error_bad_calibration" msgid="4385512597740168120">"Nem lehet használni az ujjlenyomat-érzékelőt. Keresse fel a szervizt."</string>
<string name="fingerprint_name_template" msgid="8941662088160289778">"<xliff:g id="FINGERID">%d</xliff:g>. ujj"</string>
<string name="fingerprint_app_setting_name" msgid="4253767877095495844">"Ujjlenyomat használata"</string>
<string name="fingerprint_or_screen_lock_app_setting_name" msgid="3501743523487644907">"A folytatás ujjlenyomattal vagy képernyőzárral lehetséges"</string>
@@ -619,12 +618,9 @@
<string name="face_setup_notification_content" msgid="5463999831057751676">"Feloldhatja a zárolást úgy, hogy ránéz a telefonra"</string>
<string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"További feloldási módszerek beállítása"</string>
<string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Koppintson ide ujjlenyomat hozzáadásához"</string>
- <!-- no translation found for fingerprint_recalibrate_notification_name (1414578431898579354) -->
- <skip />
- <!-- no translation found for fingerprint_recalibrate_notification_title (2406561052064558497) -->
- <skip />
- <!-- no translation found for fingerprint_recalibrate_notification_content (8519935717822194943) -->
- <skip />
+ <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Feloldás ujjlenyomattal"</string>
+ <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"Nem lehet használni az ujjlenyomat-érzékelőt"</string>
+ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Keresse fel a szervizt."</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"Sikertelen az arc pontos rögzítése. Próbálja újra."</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"Túl világos. Próbálja kevésbé erős világítással."</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"Túl sötét. Próbálja jobb megvilágítás mellett."</string>
diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml
index 4e6ee68..3429d8b 100644
--- a/core/res/res/values-in/strings.xml
+++ b/core/res/res/values-in/strings.xml
@@ -602,8 +602,7 @@
<string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"Tidak ada sidik jari yang terdaftar."</string>
<string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"Perangkat ini tidak memiliki sensor sidik jari."</string>
<string name="fingerprint_error_security_update_required" msgid="7750187320640856433">"Sensor dinonaktifkan untuk sementara."</string>
- <!-- no translation found for fingerprint_error_bad_calibration (4385512597740168120) -->
- <skip />
+ <string name="fingerprint_error_bad_calibration" msgid="4385512597740168120">"Tidak dapat menggunakan sensor sidik jari. Kunjungi penyedia reparasi"</string>
<string name="fingerprint_name_template" msgid="8941662088160289778">"Jari <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string name="fingerprint_app_setting_name" msgid="4253767877095495844">"Gunakan sidik jari"</string>
<string name="fingerprint_or_screen_lock_app_setting_name" msgid="3501743523487644907">"Gunakan sidik jari atau kunci layar"</string>
@@ -619,12 +618,9 @@
<string name="face_setup_notification_content" msgid="5463999831057751676">"Buka kunci ponsel dengan melihat ke ponsel"</string>
<string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Siapkan lebih banyak cara untuk membuka kunci"</string>
<string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Ketuk untuk menambahkan sidik jari"</string>
- <!-- no translation found for fingerprint_recalibrate_notification_name (1414578431898579354) -->
- <skip />
- <!-- no translation found for fingerprint_recalibrate_notification_title (2406561052064558497) -->
- <skip />
- <!-- no translation found for fingerprint_recalibrate_notification_content (8519935717822194943) -->
- <skip />
+ <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Fingerprint Unlock"</string>
+ <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"Tidak dapat menggunakan sensor sidik jari"</string>
+ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Kunjungi penyedia reparasi."</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"Tidak bisa mengambil data wajah akurat. Coba lagi."</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"Terlalu terang. Coba cahaya yang lebih lembut."</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"Terlalu gelap. Coba pencahayaan yang lebih cerah."</string>
diff --git a/core/res/res/values-km/strings.xml b/core/res/res/values-km/strings.xml
index 1bf8625..edbd547 100644
--- a/core/res/res/values-km/strings.xml
+++ b/core/res/res/values-km/strings.xml
@@ -602,8 +602,7 @@
<string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"មិនមានការចុះឈ្មោះស្នាមម្រាមដៃទេ។"</string>
<string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"ឧបករណ៍នេះមិនមានឧបករណ៍ចាប់ស្នាមម្រាមដៃទេ។"</string>
<string name="fingerprint_error_security_update_required" msgid="7750187320640856433">"បានបិទឧបករណ៍ចាប់សញ្ញាជាបណ្តោះអាសន្ន។"</string>
- <!-- no translation found for fingerprint_error_bad_calibration (4385512597740168120) -->
- <skip />
+ <string name="fingerprint_error_bad_calibration" msgid="4385512597740168120">"មិនអាចប្រើឧបករណ៍ចាប់ស្នាមម្រាមដៃបានទេ។ សូមទាក់ទងក្រុមហ៊ុនផ្ដល់ការជួសជុល"</string>
<string name="fingerprint_name_template" msgid="8941662088160289778">"ម្រាមដៃ <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string name="fingerprint_app_setting_name" msgid="4253767877095495844">"ប្រើស្នាមម្រាមដៃ"</string>
<string name="fingerprint_or_screen_lock_app_setting_name" msgid="3501743523487644907">"ប្រើស្នាមម្រាមដៃ ឬការចាក់សោអេក្រង់"</string>
@@ -619,12 +618,9 @@
<string name="face_setup_notification_content" msgid="5463999831057751676">"ដោះសោទូរសព្ទរបស់អ្នកដោយសម្លឹងមើលវា"</string>
<string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"រៀបចំវិធីច្រើនទៀតដើម្បីដោះសោ"</string>
<string name="fingerprint_setup_notification_content" msgid="205578121848324852">"ចុចដើម្បីបញ្ចូលស្នាមម្រាមដៃ"</string>
- <!-- no translation found for fingerprint_recalibrate_notification_name (1414578431898579354) -->
- <skip />
- <!-- no translation found for fingerprint_recalibrate_notification_title (2406561052064558497) -->
- <skip />
- <!-- no translation found for fingerprint_recalibrate_notification_content (8519935717822194943) -->
- <skip />
+ <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"ការដោះសោដោយប្រើស្នាមម្រាមដៃ"</string>
+ <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"មិនអាចប្រើឧបករណ៍ចាប់ស្នាមម្រាមដៃបានទេ"</string>
+ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"ទាក់ទងក្រុមហ៊ុនផ្ដល់ការជួសជុល។"</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"មិនអាចថតទិន្នន័យទម្រង់មុខបានត្រឹមត្រូវទេ។ សូមព្យាយាមម្ដងទៀត។"</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"ភ្លឺពេក។ សូមសាកល្បងប្រើពន្លឺស្រាលជាងនេះ។"</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"ងងឹតជ្រុល។ សូមសាកល្បងប្រើពន្លឺភ្លឺជាងនេះ។"</string>
diff --git a/core/res/res/values-kn/strings.xml b/core/res/res/values-kn/strings.xml
index 1a394ac..17b550db 100644
--- a/core/res/res/values-kn/strings.xml
+++ b/core/res/res/values-kn/strings.xml
@@ -613,10 +613,8 @@
</string-array>
<string name="fingerprint_icon_content_description" msgid="4741068463175388817">"ಫಿಂಗರ್ಪ್ರಿಂಟ್ ಐಕಾನ್"</string>
<string name="face_recalibrate_notification_name" msgid="7311163114750748686">"ಫೇಸ್ ಅನ್ಲಾಕ್"</string>
- <!-- no translation found for face_recalibrate_notification_title (2524791952735579082) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_content (3064513770251355594) -->
- <skip />
+ <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"ಫೇಸ್ ಅನ್ಲಾಕ್ ಕುರಿತು ಸಮಸ್ಯೆ ಇದೆ"</string>
+ <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"ನಿಮ್ಮ ಫೇಸ್ ಮಾಡೆಲ್ ಅನ್ನು ಅಳಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ, ನಂತರ ನಿಮ್ಮ ಫೇಸ್ ಮಾಡೆಲ್ ಅನ್ನು ಪುನಃ ಸೇರಿಸಿ"</string>
<string name="face_setup_notification_title" msgid="8843461561970741790">"ಫೇಸ್ ಅನ್ಲಾಕ್ ಅನ್ನು ಸೆಟಪ್ ಮಾಡಿ"</string>
<string name="face_setup_notification_content" msgid="5463999831057751676">"ಫೋನ್ ಅನ್ನು ನೋಡುವ ಮೂಲಕ ಅನ್ಲಾಕ್ ಮಾಡಿ"</string>
<string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"ಅನ್ಲಾಕ್ ಮಾಡಲು ಹೆಚ್ಚಿನ ಮಾರ್ಗಗಳನ್ನು ಹೊಂದಿಸಿ"</string>
diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml
index a762a85..9df09b4 100644
--- a/core/res/res/values-ko/strings.xml
+++ b/core/res/res/values-ko/strings.xml
@@ -602,8 +602,7 @@
<string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"등록된 지문이 없습니다."</string>
<string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"기기에 지문 센서가 없습니다."</string>
<string name="fingerprint_error_security_update_required" msgid="7750187320640856433">"센서가 일시적으로 사용 중지되었습니다."</string>
- <!-- no translation found for fingerprint_error_bad_calibration (4385512597740168120) -->
- <skip />
+ <string name="fingerprint_error_bad_calibration" msgid="4385512597740168120">"지문 센서를 사용할 수 없습니다. 수리업체에 방문하세요."</string>
<string name="fingerprint_name_template" msgid="8941662088160289778">"손가락 <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string name="fingerprint_app_setting_name" msgid="4253767877095495844">"지문 사용"</string>
<string name="fingerprint_or_screen_lock_app_setting_name" msgid="3501743523487644907">"지문 또는 화면 잠금 사용"</string>
@@ -619,12 +618,9 @@
<string name="face_setup_notification_content" msgid="5463999831057751676">"휴대전화의 화면을 응시하여 잠금 해제할 수 있습니다."</string>
<string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"다른 잠금 해제 방법 설정"</string>
<string name="fingerprint_setup_notification_content" msgid="205578121848324852">"지문을 추가하려면 탭하세요."</string>
- <!-- no translation found for fingerprint_recalibrate_notification_name (1414578431898579354) -->
- <skip />
- <!-- no translation found for fingerprint_recalibrate_notification_title (2406561052064558497) -->
- <skip />
- <!-- no translation found for fingerprint_recalibrate_notification_content (8519935717822194943) -->
- <skip />
+ <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"지문 잠금 해제"</string>
+ <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"지문 센서를 사용할 수 없음"</string>
+ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"수리업체에 방문하세요."</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"정확한 얼굴 데이터를 캡처하지 못했습니다. 다시 시도하세요."</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"너무 밝습니다. 조명 밝기를 조금 낮춰보세요."</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"너무 어둡습니다. 조명을 밝게 해 보세요."</string>
diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml
index 451683c..c76c811 100644
--- a/core/res/res/values-lt/strings.xml
+++ b/core/res/res/values-lt/strings.xml
@@ -608,8 +608,7 @@
<string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"Neužregistruota jokių kontrolinių kodų."</string>
<string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"Šiame įrenginyje nėra kontrolinio kodo jutiklio."</string>
<string name="fingerprint_error_security_update_required" msgid="7750187320640856433">"Jutiklis laikinai išjungtas."</string>
- <!-- no translation found for fingerprint_error_bad_calibration (4385512597740168120) -->
- <skip />
+ <string name="fingerprint_error_bad_calibration" msgid="4385512597740168120">"Negalima naudoti kontrolinio kodo jutiklio. Apsilankykite pas taisymo paslaugos teikėją"</string>
<string name="fingerprint_name_template" msgid="8941662088160289778">"<xliff:g id="FINGERID">%d</xliff:g> pirštas"</string>
<string name="fingerprint_app_setting_name" msgid="4253767877095495844">"Naudoti kontrolinį kodą"</string>
<string name="fingerprint_or_screen_lock_app_setting_name" msgid="3501743523487644907">"Naudoti kontrolinį kodą arba ekrano užraktą"</string>
@@ -625,12 +624,9 @@
<string name="face_setup_notification_content" msgid="5463999831057751676">"Atrakinkite telefoną pažiūrėję į jį"</string>
<string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Daugiau atrakinimo metodų nustatymas"</string>
<string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Palieskite, kad pridėtumėte kontrolinį kodą"</string>
- <!-- no translation found for fingerprint_recalibrate_notification_name (1414578431898579354) -->
- <skip />
- <!-- no translation found for fingerprint_recalibrate_notification_title (2406561052064558497) -->
- <skip />
- <!-- no translation found for fingerprint_recalibrate_notification_content (8519935717822194943) -->
- <skip />
+ <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Atrakinimas kontroliniu kodu"</string>
+ <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"Negalima naudoti kontrolinio kodo jutiklio"</string>
+ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Apsilankykite pas taisymo paslaugos teikėją."</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"Neužfiks. tikslūs veido duom. Bandykite dar kartą."</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"Per šviesu. Išbandykite mažesnį apšvietimą."</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"Per tamsu. Išbandykite šviesesnį apšvietimą."</string>
diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml
index a00523c..c787e50 100644
--- a/core/res/res/values-lv/strings.xml
+++ b/core/res/res/values-lv/strings.xml
@@ -605,8 +605,7 @@
<string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"Nav reģistrēts neviens pirksta nospiedums."</string>
<string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"Šajā ierīcē nav pirksta nospieduma sensora."</string>
<string name="fingerprint_error_security_update_required" msgid="7750187320640856433">"Sensors ir īslaicīgi atspējots."</string>
- <!-- no translation found for fingerprint_error_bad_calibration (4385512597740168120) -->
- <skip />
+ <string name="fingerprint_error_bad_calibration" msgid="4385512597740168120">"Nevar izmantot pirksta nospieduma sensoru. Sazinieties ar remonta pakalpojumu sniedzēju."</string>
<string name="fingerprint_name_template" msgid="8941662088160289778">"<xliff:g id="FINGERID">%d</xliff:g>. pirksts"</string>
<string name="fingerprint_app_setting_name" msgid="4253767877095495844">"Pirksta nospieduma izmantošana"</string>
<string name="fingerprint_or_screen_lock_app_setting_name" msgid="3501743523487644907">"Pirksta nospieduma vai ekrāna bloķēšanas metodes izmantošana"</string>
@@ -622,12 +621,9 @@
<string name="face_setup_notification_content" msgid="5463999831057751676">"Atbloķējiet tālruni, skatoties uz to"</string>
<string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Citi atbloķēšanas veidi"</string>
<string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Pieskarieties, lai pievienotu pirksta nospiedumu"</string>
- <!-- no translation found for fingerprint_recalibrate_notification_name (1414578431898579354) -->
- <skip />
- <!-- no translation found for fingerprint_recalibrate_notification_title (2406561052064558497) -->
- <skip />
- <!-- no translation found for fingerprint_recalibrate_notification_content (8519935717822194943) -->
- <skip />
+ <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Autorizācija ar pirksta nospiedumu"</string>
+ <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"Nevar izmantot pirksta nospieduma sensoru"</string>
+ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Sazinieties ar remonta pakalpojumu sniedzēju."</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"Neizdevās tvert sejas datus. Mēģiniet vēlreiz."</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"Pārāk spilgts. Izmēģiniet maigāku apgaismojumu."</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"Pārāk tumšs. Izmēģiniet spožāku apgaismojumu."</string>
diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml
index 8c6565e..2274cda 100644
--- a/core/res/res/values-ml/strings.xml
+++ b/core/res/res/values-ml/strings.xml
@@ -602,8 +602,7 @@
<string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"വിരലടയാളങ്ങൾ എൻറോൾ ചെയ്തിട്ടില്ല."</string>
<string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"ഈ ഉപകരണത്തിൽ ഫിംഗർപ്രിന്റ് സെൻസറില്ല."</string>
<string name="fingerprint_error_security_update_required" msgid="7750187320640856433">"സെൻസർ താൽക്കാലികമായി പ്രവർത്തനരഹിതമാക്കി."</string>
- <!-- no translation found for fingerprint_error_bad_calibration (4385512597740168120) -->
- <skip />
+ <string name="fingerprint_error_bad_calibration" msgid="4385512597740168120">"വിരലടയാള സെൻസർ ഉപയോഗിക്കാനാകുന്നില്ല. റിപ്പയർ കേന്ദ്രം സന്ദർശിക്കുക"</string>
<string name="fingerprint_name_template" msgid="8941662088160289778">"ഫിംഗർ <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string name="fingerprint_app_setting_name" msgid="4253767877095495844">"ഫിംഗർപ്രിന്റ് ഉപയോഗിക്കുക"</string>
<string name="fingerprint_or_screen_lock_app_setting_name" msgid="3501743523487644907">"ഫിംഗർപ്രിന്റ് അല്ലെങ്കിൽ സ്ക്രീൻ ലോക്ക് ഉപയോഗിക്കുക"</string>
@@ -619,12 +618,9 @@
<string name="face_setup_notification_content" msgid="5463999831057751676">"ഫോണിലേക്ക് നോക്കി അത് അൺലോക്ക് ചെയ്യുക"</string>
<string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"അൺലോക്ക് ചെയ്യുന്നതിനുള്ള കൂടുതൽ വഴികൾ സജ്ജീകരിക്കുക"</string>
<string name="fingerprint_setup_notification_content" msgid="205578121848324852">"ഫിംഗർപ്രിന്റ് ചേർക്കാൻ ടാപ്പ് ചെയ്യുക"</string>
- <!-- no translation found for fingerprint_recalibrate_notification_name (1414578431898579354) -->
- <skip />
- <!-- no translation found for fingerprint_recalibrate_notification_title (2406561052064558497) -->
- <skip />
- <!-- no translation found for fingerprint_recalibrate_notification_content (8519935717822194943) -->
- <skip />
+ <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"ഫിംഗർപ്രിന്റ് അൺലോക്ക്"</string>
+ <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"വിരലടയാള സെൻസർ ഉപയോഗിക്കാനാകുന്നില്ല"</string>
+ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"റിപ്പയർ കേന്ദ്രം സന്ദർശിക്കുക."</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"കൃത്യ മുഖ ഡാറ്റ എടുക്കാനായില്ല. വീണ്ടും ശ്രമിക്കൂ."</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"വളരെയധികം തെളിച്ചം. സൗമ്യതയേറിയ പ്രകാശം ശ്രമിക്കൂ."</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"വളരെ ഇരുണ്ടത്. തിളക്കമേറിയ ലൈറ്റിംഗ് പരീക്ഷിക്കുക."</string>
diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml
index e699ebe..095c3d3 100644
--- a/core/res/res/values-ms/strings.xml
+++ b/core/res/res/values-ms/strings.xml
@@ -602,8 +602,7 @@
<string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"Tiada cap jari didaftarkan."</string>
<string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"Peranti ini tiada penderia cap jari."</string>
<string name="fingerprint_error_security_update_required" msgid="7750187320640856433">"Penderia dilumpuhkan sementara."</string>
- <!-- no translation found for fingerprint_error_bad_calibration (4385512597740168120) -->
- <skip />
+ <string name="fingerprint_error_bad_calibration" msgid="4385512597740168120">"Tidak boleh menggunakan penderia cap jari. Lawati penyedia pembaikan"</string>
<string name="fingerprint_name_template" msgid="8941662088160289778">"Jari <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string name="fingerprint_app_setting_name" msgid="4253767877095495844">"Gunakan cap jari"</string>
<string name="fingerprint_or_screen_lock_app_setting_name" msgid="3501743523487644907">"Gunakan cap jari atau kunci skrin"</string>
@@ -619,12 +618,9 @@
<string name="face_setup_notification_content" msgid="5463999831057751676">"Buka kunci telefon anda dengan melihat telefon anda"</string>
<string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Sediakan lebih banyak cara untuk membuka kunci"</string>
<string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Ketik untuk menambahkan cap jari"</string>
- <!-- no translation found for fingerprint_recalibrate_notification_name (1414578431898579354) -->
- <skip />
- <!-- no translation found for fingerprint_recalibrate_notification_title (2406561052064558497) -->
- <skip />
- <!-- no translation found for fingerprint_recalibrate_notification_content (8519935717822194943) -->
- <skip />
+ <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Buka Kunci Cap Jari"</string>
+ <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"Tidak boleh menggunakan penderia cap jari"</string>
+ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Lawati penyedia pembaikan."</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"Gagal menangkap data wajah dgn tepat. Cuba lagi."</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"Terlalu terang. Cuba pencahayaan yang lebih lembut."</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"Terlalu gelap. Cuba pencahayaan yang lebih cerah."</string>
diff --git a/core/res/res/values-my/strings.xml b/core/res/res/values-my/strings.xml
index f0b5b0f..bcd4ace 100644
--- a/core/res/res/values-my/strings.xml
+++ b/core/res/res/values-my/strings.xml
@@ -602,8 +602,7 @@
<string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"မည်သည့် လက်ဗွေကိုမျှ ထည့်သွင်းမထားပါ။"</string>
<string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"ဤစက်တွင် လက်ဗွေအာရုံခံကိရိယာ မရှိပါ။"</string>
<string name="fingerprint_error_security_update_required" msgid="7750187320640856433">"အာရုံခံကိရိယာကို ယာယီပိတ်ထားသည်။"</string>
- <!-- no translation found for fingerprint_error_bad_calibration (4385512597740168120) -->
- <skip />
+ <string name="fingerprint_error_bad_calibration" msgid="4385512597740168120">"လက်ဗွေ အာရုံခံကိရိယာကို အသုံးပြု၍ မရပါ။ ပြုပြင်ရေး ဝန်ဆောင်မှုပေးသူထံသို့ သွားပါ"</string>
<string name="fingerprint_name_template" msgid="8941662088160289778">"လက်ချောင်း <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string name="fingerprint_app_setting_name" msgid="4253767877095495844">"လက်ဗွေ သုံးခြင်း"</string>
<string name="fingerprint_or_screen_lock_app_setting_name" msgid="3501743523487644907">"လက်ဗွေ (သို့) ဖန်သားပြင်လော့ခ်ချခြင်းကို သုံးခြင်း"</string>
@@ -619,12 +618,9 @@
<string name="face_setup_notification_content" msgid="5463999831057751676">"သင့်ဖုန်းကိုကြည့်၍ သော့ဖွင့်ပါ"</string>
<string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"သော့ဖွင့်ရန် နောက်ထပ်နည်းလမ်းများကို စနစ်ထည့်သွင်းပါ"</string>
<string name="fingerprint_setup_notification_content" msgid="205578121848324852">"လက်ဗွေထည့်ရန် တို့ပါ"</string>
- <!-- no translation found for fingerprint_recalibrate_notification_name (1414578431898579354) -->
- <skip />
- <!-- no translation found for fingerprint_recalibrate_notification_title (2406561052064558497) -->
- <skip />
- <!-- no translation found for fingerprint_recalibrate_notification_content (8519935717822194943) -->
- <skip />
+ <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"လက်ဗွေသုံး လော့ခ်ဖွင့်ခြင်း"</string>
+ <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"လက်ဗွေ အာရုံခံကိရိယာကို အသုံးပြု၍ မရပါ"</string>
+ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"ပြုပြင်ရေး ဝန်ဆောင်မှုပေးသူထံသို့ သွားပါ။"</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"မျက်နှာဒေတာ အမှန် မရိုက်ယူနိုင်ပါ၊ ထပ်စမ်းကြည့်ပါ။"</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"အလွန် လင်းသည်။ အလင်းလျှော့ကြည့်ပါ။"</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"အလွန်မှောင်သည်။ ပိုလင်းအောင် လုပ်ကြည့်ပါ။"</string>
diff --git a/core/res/res/values-or/strings.xml b/core/res/res/values-or/strings.xml
index 005d9cc..7885f67 100644
--- a/core/res/res/values-or/strings.xml
+++ b/core/res/res/values-or/strings.xml
@@ -585,8 +585,7 @@
<string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"ଅନ୍ୟ ଏକ ଟିପଚିହ୍ନ ବ୍ୟବହାର କରି ଦେଖନ୍ତୁ"</string>
<string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"ବହୁତ ଉଜ୍ଜ୍ୱଳ"</string>
<string name="fingerprint_acquired_try_adjusting" msgid="3667006071003809364">"ଆଡଜଷ୍ଟ କରି ଦେଖନ୍ତୁ"</string>
- <!-- no translation found for fingerprint_acquired_immobile (1621891895241888048) -->
- <skip />
+ <string name="fingerprint_acquired_immobile" msgid="1621891895241888048">"ପ୍ରତି ଥର ଆପଣଙ୍କ ଆଙ୍ଗୁଠିର ସ୍ଥାନ ସାମାନ୍ୟ ପରିବର୍ତ୍ତନ କରନ୍ତୁ"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_authenticated" msgid="2024862866860283100">"ଟିପଚିହ୍ନ ପ୍ରମାଣିତ ହେଲା"</string>
diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml
index 5e40452..f44c8d8 100644
--- a/core/res/res/values-sk/strings.xml
+++ b/core/res/res/values-sk/strings.xml
@@ -608,8 +608,7 @@
<string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"Neregistrovali ste žiadne odtlačky prstov."</string>
<string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"Toto zariadenie nemá senzor odtlačkov prstov."</string>
<string name="fingerprint_error_security_update_required" msgid="7750187320640856433">"Senzor je dočasne vypnutý."</string>
- <!-- no translation found for fingerprint_error_bad_calibration (4385512597740168120) -->
- <skip />
+ <string name="fingerprint_error_bad_calibration" msgid="4385512597740168120">"Senzor odtlačkov prstov nie je možné používať. Navštívte poskytovateľa opráv."</string>
<string name="fingerprint_name_template" msgid="8941662088160289778">"Prst: <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string name="fingerprint_app_setting_name" msgid="4253767877095495844">"Použiť odtlačok prsta"</string>
<string name="fingerprint_or_screen_lock_app_setting_name" msgid="3501743523487644907">"Použiť odtlačok prsta alebo zámku obrazovky"</string>
@@ -625,12 +624,9 @@
<string name="face_setup_notification_content" msgid="5463999831057751676">"Odomykajte telefón tak, že sa naň pozriete"</string>
<string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Nastavte viac spôsobov odomknutia"</string>
<string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Klepnutím pridajte odtlačok prsta"</string>
- <!-- no translation found for fingerprint_recalibrate_notification_name (1414578431898579354) -->
- <skip />
- <!-- no translation found for fingerprint_recalibrate_notification_title (2406561052064558497) -->
- <skip />
- <!-- no translation found for fingerprint_recalibrate_notification_content (8519935717822194943) -->
- <skip />
+ <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Odomknutie odtlačkom prsta"</string>
+ <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"Senzor odtlačkov prstov nie je možné používať"</string>
+ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Navštívte poskytovateľa opráv."</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"Nepodarilo sa nasnímať presné údaje o tvári. Skúste to znova."</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"Príliš veľa svetla. Skúste jemnejšie osvetlenie."</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"Príliš veľká tma. Skúste lepšie osvetlenie."</string>
diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml
index 657f102..163ad53 100644
--- a/core/res/res/values-sw/strings.xml
+++ b/core/res/res/values-sw/strings.xml
@@ -602,8 +602,7 @@
<string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"Hakuna alama za vidole zilizojumuishwa."</string>
<string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"Kifaa hiki hakina kitambua alama ya kidole."</string>
<string name="fingerprint_error_security_update_required" msgid="7750187320640856433">"Kitambuzi kimezimwa kwa muda."</string>
- <!-- no translation found for fingerprint_error_bad_calibration (4385512597740168120) -->
- <skip />
+ <string name="fingerprint_error_bad_calibration" msgid="4385512597740168120">"Imeshindwa kutumia kitambua alama ya kidole. Tembelea mtoa huduma za urekebishaji"</string>
<string name="fingerprint_name_template" msgid="8941662088160289778">"Kidole cha <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string name="fingerprint_app_setting_name" msgid="4253767877095495844">"Tumia alama ya kidole"</string>
<string name="fingerprint_or_screen_lock_app_setting_name" msgid="3501743523487644907">"Tumia alama ya kidole au mbinu ya kufunga skrini"</string>
@@ -619,12 +618,9 @@
<string name="face_setup_notification_content" msgid="5463999831057751676">"Fungua simu yako kwa kuiangalia"</string>
<string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Weka mipangilio ya mbinu zaidi za kufungua"</string>
<string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Gusa ili uweke alama ya kidole"</string>
- <!-- no translation found for fingerprint_recalibrate_notification_name (1414578431898579354) -->
- <skip />
- <!-- no translation found for fingerprint_recalibrate_notification_title (2406561052064558497) -->
- <skip />
- <!-- no translation found for fingerprint_recalibrate_notification_content (8519935717822194943) -->
- <skip />
+ <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Kufungua kwa Alama ya Kidole"</string>
+ <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"Imeshindwa kutumia kitambua alama ya kidole"</string>
+ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Tembelea mtoa huduma za urekebishaji."</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"Imeshindwa kunasa data sahihi ya uso. Jaribu tena."</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"Inang\'aa mno. Jaribu mwangaza hafifu"</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"Hakuna mwangaza wa kutosha. Jaribu kuongeza mwangaza."</string>
diff --git a/core/res/res/values-ta/strings.xml b/core/res/res/values-ta/strings.xml
index f14d6e4..26fa15b 100644
--- a/core/res/res/values-ta/strings.xml
+++ b/core/res/res/values-ta/strings.xml
@@ -47,7 +47,7 @@
<string name="mismatchPin" msgid="2929611853228707473">"உள்ளிட்ட பின்கள் பொருந்தவில்லை."</string>
<string name="invalidPin" msgid="7542498253319440408">"4 இலிருந்து 8 எண்கள் வரையுள்ள பின் ஐத் தட்டச்சு செய்யவும்."</string>
<string name="invalidPuk" msgid="8831151490931907083">"8 அல்லது அதற்கு மேல் எண்கள் உள்ள PUK ஐத் தட்டச்சு செய்யவும்."</string>
- <string name="needPuk" msgid="7321876090152422918">"உங்கள் சிம் கார்டு PUK பூட்டுதல் செய்யப்பட்டுள்ளது. அதைத் திறக்க PUK குறியீட்டைத் உள்ளிடவும்."</string>
+ <string name="needPuk" msgid="7321876090152422918">"உங்கள் சிம் கார்டு PUK பூட்டுதல் செய்யப்பட்டுள்ளது. அதை அன்லாக் செய்ய PUK குறியீட்டை உள்ளிடவும்."</string>
<string name="needPuk2" msgid="7032612093451537186">"சிம் கார்டைத் தடுப்பு நீக்க PUK2 ஐ உள்ளிடவும்."</string>
<string name="enablePin" msgid="2543771964137091212">"தோல்வி, சிம்/RUIM பூட்டை இயக்கவும்."</string>
<plurals name="pinpuk_attempts" formatted="false" msgid="1619867269012213584">
@@ -892,7 +892,7 @@
<string name="lockscreen_pattern_correct" msgid="8050630103651508582">"சரி!"</string>
<string name="lockscreen_pattern_wrong" msgid="2940138714468358458">"மீண்டும் முயற்சிக்கவும்"</string>
<string name="lockscreen_password_wrong" msgid="8605355913868947490">"மீண்டும் முயற்சிக்கவும்"</string>
- <string name="lockscreen_storage_locked" msgid="634993789186443380">"எல்லா அம்சங்கள் & தரவை பெற, சாதனத்தை திறக்கவும்"</string>
+ <string name="lockscreen_storage_locked" msgid="634993789186443380">"எல்லா அம்சங்கள் & தரவை பெற, சாதனத்தை அன்லாக் செய்யவும்"</string>
<string name="faceunlock_multiple_failures" msgid="681991538434031708">"முகம் காட்டித் திறத்தல் அம்சத்தை அதிகமுறை பயன்படுத்துவிட்டீர்கள்"</string>
<string name="lockscreen_missing_sim_message_short" msgid="1248431165144893792">"சிம் கார்டு இல்லை"</string>
<string name="lockscreen_missing_sim_message" product="tablet" msgid="8596805728510570760">"டேப்லெட்டில் சிம் கார்டு இல்லை."</string>
@@ -918,10 +918,10 @@
<string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="6458790975898594240">"திறப்பதற்கான வடிவத்தை <xliff:g id="NUMBER_0">%1$d</xliff:g> முறை தவறாக வரைந்துள்ளீர்கள். \n\n<xliff:g id="NUMBER_1">%2$d</xliff:g> வினாடிகள் கழித்து முயற்சிக்கவும்."</string>
<string name="lockscreen_too_many_failed_password_attempts_dialog_message" msgid="3118353451602377380">"உங்கள் கடவுச்சொல்லை <xliff:g id="NUMBER_0">%1$d</xliff:g> முறை தவறாக உள்ளிட்டீர்கள். \n\n<xliff:g id="NUMBER_1">%2$d</xliff:g> வினாடிகள் கழித்து முயற்சிக்கவும்."</string>
<string name="lockscreen_too_many_failed_pin_attempts_dialog_message" msgid="2874278239714821984">"உங்கள் பின்னை <xliff:g id="NUMBER_0">%1$d</xliff:g> முறை தவறாக உள்ளிட்டீர்கள். \n\n<xliff:g id="NUMBER_1">%2$d</xliff:g> வினாடிகள் கழித்து முயற்சிக்கவும்."</string>
- <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="3069635524964070596">"திறப்பதற்கான வடிவத்தை <xliff:g id="NUMBER_0">%1$d</xliff:g> முறை தவறாக வரைந்துள்ளீர்கள். இன்னும் <xliff:g id="NUMBER_1">%2$d</xliff:g> முறை தவறாக வரைந்தால், உங்கள் Google உள்நுழைவைப் பயன்படுத்தி டேப்லெட்டைத் திறக்குமாறு கேட்கப்படுவீர்கள். \n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> வினாடிகள் கழித்து முயற்சிக்கவும்."</string>
- <string name="lockscreen_failed_attempts_almost_glogin" product="tv" msgid="6399092175942158529">"திறப்பதற்கான பேட்டர்னை <xliff:g id="NUMBER_0">%1$d</xliff:g> முறை தவறாக வரைந்துள்ளீர்கள். இன்னும் <xliff:g id="NUMBER_1">%2$d</xliff:g> முறை தவறாக வரைந்தால் உங்கள் Google உள்நுழைவைப் பயன்படுத்தி Android TVயைத் திறக்குமாறு கேட்கப்படுவீர்கள். \n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> வினாடிகளில் மீண்டும் முயலவும்."</string>
- <string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="5691623136957148335">"திறப்பதற்கான வடிவத்தை <xliff:g id="NUMBER_0">%1$d</xliff:g> முறை தவறாக வரைந்துள்ளீர்கள். இன்னும் <xliff:g id="NUMBER_1">%2$d</xliff:g> முறை தவறாக வரைந்தால், உங்கள் Google உள்நுழைவைப் பயன்படுத்தி மொபைலைத் திறக்குமாறு கேட்கப்படுவீர்கள். \n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> வினாடிகள் கழித்து முயற்சிக்கவும்."</string>
- <string name="lockscreen_failed_attempts_almost_at_wipe" product="tablet" msgid="7914445759242151426">"டேப்லெட்டைத் தடைநீக்க <xliff:g id="NUMBER_0">%1$d</xliff:g> முறை தவறாக முயற்சித்துள்ளீர்கள். இன்னும் <xliff:g id="NUMBER_1">%2$d</xliff:g> தோல்வி முயற்சிகளுக்குப் பிறகு, டேப்லெட்டானது ஆரம்ப இயல்புநிலைக்கு மீட்டமைக்கப்பட்டு, எல்லா பயனர் தரவும் இழக்கப்படும்."</string>
+ <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="3069635524964070596">"அன்லாக் வடிவத்தை <xliff:g id="NUMBER_0">%1$d</xliff:g> முறை தவறாக வரைந்துள்ளீர்கள். இன்னும் <xliff:g id="NUMBER_1">%2$d</xliff:g> முறை தவறாக வரைந்தால், உங்கள் Google உள்நுழைவைப் பயன்படுத்தி டேப்லெட்டை அன்லாக் செய்யுமாறு கேட்கப்படுவீர்கள். \n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> வினாடிகள் கழித்து முயற்சிக்கவும்."</string>
+ <string name="lockscreen_failed_attempts_almost_glogin" product="tv" msgid="6399092175942158529">"அன்லாக் பேட்டர்னை <xliff:g id="NUMBER_0">%1$d</xliff:g> முறை தவறாக வரைந்துள்ளீர்கள். இன்னும் <xliff:g id="NUMBER_1">%2$d</xliff:g> முறை தவறாக வரைந்தால் உங்கள் Google உள்நுழைவைப் பயன்படுத்தி Android TVயை அன்லாக் செய்யுமாறு கேட்கப்படுவீர்கள். \n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> வினாடிகளில் மீண்டும் முயலவும்."</string>
+ <string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="5691623136957148335">"அன்லாக் பேட்டர்னை <xliff:g id="NUMBER_0">%1$d</xliff:g> முறை தவறாக வரைந்துள்ளீர்கள். இன்னும் <xliff:g id="NUMBER_1">%2$d</xliff:g> முறை தவறாக வரைந்தால், உங்கள் Google உள்நுழைவைப் பயன்படுத்தி மொபைலை அன்லாக் செய்யுமாறு கேட்கப்படுவீர்கள். \n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> வினாடிகள் கழித்து முயற்சிக்கவும்."</string>
+ <string name="lockscreen_failed_attempts_almost_at_wipe" product="tablet" msgid="7914445759242151426">"டேப்லெட்டை அன்லாக் செய்ய <xliff:g id="NUMBER_0">%1$d</xliff:g> முறை தவறாக முயற்சித்துள்ளீர்கள். இன்னும் <xliff:g id="NUMBER_1">%2$d</xliff:g> தோல்வி முயற்சிகளுக்குப் பிறகு, டேப்லெட்டானது ஆரம்ப இயல்புநிலைக்கு மீட்டமைக்கப்பட்டு, எல்லா பயனர் தரவும் இழக்கப்படும்."</string>
<string name="lockscreen_failed_attempts_almost_at_wipe" product="tv" msgid="4275591249631864248">"உங்கள் Android TVயில் <xliff:g id="NUMBER_0">%1$d</xliff:g> முறை தவறான கடவுச்சொல்லை உள்ளிட்டுத் திறக்க முயன்றுள்ளீர்கள். இன்னும் <xliff:g id="NUMBER_1">%2$d</xliff:g> முறை தவறான கடவுச்சொல்லை உள்ளிட்டு முயன்றால் உங்கள் Android TV ஆரம்ப நிலைக்கு மீட்டமைக்கப்படுவதுடன் பயனரின் அனைத்துத் தரவையும் இழக்க நேரிடும்."</string>
<string name="lockscreen_failed_attempts_almost_at_wipe" product="default" msgid="1166532464798446579">"தொலைபேசியைத் தடைநீக்க <xliff:g id="NUMBER_0">%1$d</xliff:g> முறை தவறாக முயற்சித்துள்ளீர்கள். இன்னும் <xliff:g id="NUMBER_1">%2$d</xliff:g> தோல்வி முயற்சிகளுக்குப் பிறகு, தொலைபேசியானது ஆரம்ப இயல்புநிலைக்கு மீட்டமைக்கப்பட்டு, எல்லா பயனர் தரவும் இழக்கப்படும்."</string>
<string name="lockscreen_failed_attempts_now_wiping" product="tablet" msgid="8682445539263683414">"நீங்கள் டேப்லெட்டைத் தடைநீக்க <xliff:g id="NUMBER">%d</xliff:g> முறை தவறாக முயற்சித்துள்ளீர்கள். டேப்லெட் இப்போது ஆரம்ப இயல்புநிலைக்கு மீட்டமைக்கப்படும்."</string>
@@ -929,7 +929,7 @@
<string name="lockscreen_failed_attempts_now_wiping" product="default" msgid="2203704707679895487">"நீங்கள் தொலைபேசியைத் தடைநீக்க <xliff:g id="NUMBER">%d</xliff:g> முறை தவறாக முயற்சித்துள்ளீர்கள். தொலைபேசி இப்போது ஆரம்ப இயல்புநிலைக்கு மீட்டமைக்கப்படும்."</string>
<string name="lockscreen_too_many_failed_attempts_countdown" msgid="6807200118164539589">"<xliff:g id="NUMBER">%d</xliff:g> வினாடிகள் கழித்து மீண்டும் முயற்சிக்கவும்."</string>
<string name="lockscreen_forgot_pattern_button_text" msgid="8362442730606839031">"வடிவத்தை மறந்துவிட்டீர்களா?"</string>
- <string name="lockscreen_glogin_forgot_pattern" msgid="9218940117797602518">"கணக்கைத் திற"</string>
+ <string name="lockscreen_glogin_forgot_pattern" msgid="9218940117797602518">"கணக்கை அன்லாக் செய்"</string>
<string name="lockscreen_glogin_too_many_attempts" msgid="3775904917743034195">"அதிகமான வடிவ முயற்சிகள்"</string>
<string name="lockscreen_glogin_instructions" msgid="4695162942525531700">"திறக்க, Google கணக்கு மூலம் உள்நுழையவும்."</string>
<string name="lockscreen_glogin_username_hint" msgid="6916101478673157045">"பயனர்பெயர் (மின்னஞ்சல் முகவரி)"</string>
@@ -951,7 +951,7 @@
<string name="keyguard_accessibility_add_widget" msgid="8245795023551343672">"விட்ஜெட்டைச் சேர்க்கவும்."</string>
<string name="keyguard_accessibility_widget_empty_slot" msgid="544239307077644480">"காலியானது"</string>
<string name="keyguard_accessibility_unlock_area_expanded" msgid="7768634718706488951">"திறக்கும் பகுதி விரிவாக்கப்பட்டது."</string>
- <string name="keyguard_accessibility_unlock_area_collapsed" msgid="4729922043778400434">"திறக்கும் பகுதி சுருக்கப்பட்டது."</string>
+ <string name="keyguard_accessibility_unlock_area_collapsed" msgid="4729922043778400434">"அன்லாக் செய்வதற்கான பகுதி சுருக்கப்பட்டது."</string>
<string name="keyguard_accessibility_widget" msgid="6776892679715699875">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> விட்ஜெட்."</string>
<string name="keyguard_accessibility_user_selector" msgid="1466067610235696600">"பயனர் தேர்வி"</string>
<string name="keyguard_accessibility_status" msgid="6792745049712397237">"நிலை"</string>
@@ -960,12 +960,12 @@
<string name="keyguard_accessibility_widget_reorder_start" msgid="7066213328912939191">"விட்ஜெட்டை மீண்டும் வரிசைப்படுத்துவது தொடங்கியது."</string>
<string name="keyguard_accessibility_widget_reorder_end" msgid="1083806817600593490">"விட்ஜெட்டை மீண்டும் வரிசைப்படுத்துவது முடிந்தது."</string>
<string name="keyguard_accessibility_widget_deleted" msgid="1509738950119878705">"விட்ஜெட் <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> நீக்கப்பட்டது."</string>
- <string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"திறப்பதற்கான பகுதியை விவரிக்கவும்."</string>
+ <string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"அன்லாக் செய்வதற்கான பகுதியை விரிவாக்கவும்"</string>
<string name="keyguard_accessibility_slide_unlock" msgid="2968195219692413046">"ஸ்லைடு மூலம் திறத்தல்."</string>
<string name="keyguard_accessibility_pattern_unlock" msgid="8669128146589233293">"பேட்டர்ன் மூலம் திறத்தல்."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4533832120787386728">"முகம் காட்டித் திறத்தல்."</string>
<string name="keyguard_accessibility_pin_unlock" msgid="4020864007967340068">"Pin மூலம் திறத்தல்."</string>
- <string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"சிம்மைத் திறக்கும் பின்."</string>
+ <string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"சிம் பின் அன்லாக்."</string>
<string name="keyguard_accessibility_sim_puk_unlock" msgid="3459003464041899101">"சிம்மைத் திறக்கும் Puk."</string>
<string name="keyguard_accessibility_password_unlock" msgid="6130186108581153265">"கடவுச்சொல் மூலம் திறத்தல்."</string>
<string name="keyguard_accessibility_pattern_area" msgid="1419570880512350689">"வடிவப் பகுதி."</string>
@@ -1572,7 +1572,7 @@
<string name="shareactionprovider_share_with" msgid="2753089758467748982">"இவர்களுடன் பகிர்"</string>
<string name="shareactionprovider_share_with_application" msgid="4902832247173666973">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> உடன் பகிர்"</string>
<string name="content_description_sliding_handle" msgid="982510275422590757">"ஸ்லைடிங் ஹேன்டில். தொட்டுப் பிடிக்கவும்."</string>
- <string name="description_target_unlock_tablet" msgid="7431571180065859551">"திறக்க ஸ்வைப் செய்யவும்."</string>
+ <string name="description_target_unlock_tablet" msgid="7431571180065859551">"அன்லாக் செய்ய ஸ்வைப் செய்யவும்."</string>
<string name="action_bar_home_description" msgid="1501655419158631974">"முகப்பிற்கு வழிசெலுத்து"</string>
<string name="action_bar_up_description" msgid="6611579697195026932">"மேலே வழிசெலுத்து"</string>
<string name="action_menu_overflow_description" msgid="4579536843510088170">"மேலும் விருப்பங்கள்"</string>
@@ -1669,7 +1669,7 @@
<string name="kg_invalid_puk" msgid="4809502818518963344">"சரியான PUK குறியீட்டை மீண்டும் உள்ளிடவும். தொடர் முயற்சிகள் சிம் ஐ நிரந்தரமாக முடக்கிவிடும்."</string>
<string name="kg_invalid_confirm_pin_hint" product="default" msgid="4705368340409816254">"பின் குறியீடுகள் பொருந்தவில்லை"</string>
<string name="kg_login_too_many_attempts" msgid="699292728290654121">"அதிகமான வடிவ முயற்சிகள்"</string>
- <string name="kg_login_instructions" msgid="3619844310339066827">"திறக்க, உங்கள் Google கணக்கு மூலம் உள்நுழையவும்."</string>
+ <string name="kg_login_instructions" msgid="3619844310339066827">"அன்லாக் செய்ய உங்கள் Google கணக்கு மூலம் உள்நுழையவும்."</string>
<string name="kg_login_username_hint" msgid="1765453775467133251">"பயனர்பெயர் (மின்னஞ்சல்)"</string>
<string name="kg_login_password_hint" msgid="3330530727273164402">"கடவுச்சொல்"</string>
<string name="kg_login_submit_button" msgid="893611277617096870">"உள்நுழைக"</string>
@@ -1682,12 +1682,12 @@
<string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="3479940221343361587">"டேப்லெட்டைத் திறக்க <xliff:g id="NUMBER_0">%1$d</xliff:g> முறை தவறாக முயற்சித்துள்ளீர்கள். இன்னும் <xliff:g id="NUMBER_1">%2$d</xliff:g> தோல்வி முயற்சிகளுக்குப் பிறகு, டேப்லெட்டானது ஆரம்பநிலைக்கு மீட்டமைக்கப்பட்டு, எல்லா பயனர் தரவையும் இழப்பீர்கள்."</string>
<string name="kg_failed_attempts_almost_at_wipe" product="tv" msgid="9064457748587850217">"உங்கள் Android TVயில் <xliff:g id="NUMBER_0">%1$d</xliff:g> முறை தவறான கடவுச்சொல்லை உள்ளிட்டுத் திறக்க முயன்றுள்ளீர்கள். இன்னும் <xliff:g id="NUMBER_1">%2$d</xliff:g> முறை தவறான கடவுச்சொல்லை உள்ளிட்டு முயன்றால் உங்கள் Android TV ஆரம்ப நிலைக்கு மீட்டமைக்கப்படுவதுடன் பயனரின் அனைத்துத் தரவையும் இழக்க நேரிடும்."</string>
<string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="5955398963754432548">"மொபைலைத் திறக்க <xliff:g id="NUMBER_0">%1$d</xliff:g> முறை தவறாக முயற்சித்துள்ளீர்கள். இன்னும் <xliff:g id="NUMBER_1">%2$d</xliff:g> தோல்வி முயற்சிகளுக்குப் பிறகு,மொபைலானது ஆரம்பநிலைக்கு மீட்டமைக்கப்பட்டு, எல்லா பயனர் தரவையும் இழப்பீர்கள்."</string>
- <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="2299099385175083308">"டேப்லெட்டைத் திறக்க <xliff:g id="NUMBER">%d</xliff:g> முறை தவறாக முயற்சித்துள்ளீர்கள். டேப்லெட் இப்போது ஆரம்பநிலைக்கு மீட்டமைக்கப்படும்."</string>
+ <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="2299099385175083308">"டேப்லெட்டை அன்லாக் செய்ய <xliff:g id="NUMBER">%d</xliff:g> முறை தவறாக முயற்சித்துள்ளீர்கள். டேப்லெட் இப்போது ஆரம்பநிலைக்கு மீட்டமைக்கப்படும்."</string>
<string name="kg_failed_attempts_now_wiping" product="tv" msgid="5045460916106267585">"உங்கள் Android TVயில் <xliff:g id="NUMBER">%d</xliff:g> முறை தவறான கடவுச்சொல்லை உள்ளிட்டுத் திறக்க முயன்றுள்ளீர்கள். இப்போது உங்கள் Android TV ஆரம்ப நிலைக்கு மீட்டமைக்கப்படும்."</string>
<string name="kg_failed_attempts_now_wiping" product="default" msgid="5043730590446071189">"மொபைலைத் திறக்க <xliff:g id="NUMBER">%d</xliff:g> முறை தவறாக முயற்சித்துள்ளீர்கள். மொபைல் இப்போது ஆரம்பநிலைக்கு மீட்டமைக்கப்படும்."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="7086799295109717623">"திறப்பதற்கான வடிவத்தை <xliff:g id="NUMBER_0">%1$d</xliff:g> முறை தவறாக வரைந்துள்ளீர்கள். மேலும் <xliff:g id="NUMBER_1">%2$d</xliff:g> தோல்வி முயற்சிகளுக்குப் பிறகு, மின்னஞ்சல் கணக்கைப் பயன்படுத்தி உங்கள் டேப்லெட்டைத் திறக்க கேட்கப்படுவீர்கள்.\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> வினாடிகளில் மீண்டும் முயற்சிக்கவும்."</string>
<string name="kg_failed_attempts_almost_at_login" product="tv" msgid="4670840383567106114">"திறப்பதற்கான பேட்டர்னை <xliff:g id="NUMBER_0">%1$d</xliff:g> முறை தவறாக வரைந்துவிட்டீர்கள். இன்னும் <xliff:g id="NUMBER_1">%2$d</xliff:g> முறை தவறாக வரைந்தால் மின்னஞ்சல் கணக்கைப் பயன்படுத்தி Android TVயைத் திறக்கும்படி கேட்கப்படுவீர்கள்.\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> வினாடிகளில் மீண்டும் முயலவும்."</string>
- <string name="kg_failed_attempts_almost_at_login" product="default" msgid="5270861875006378092">"திறப்பதற்கான வடிவத்தை <xliff:g id="NUMBER_0">%1$d</xliff:g> முறை தவறாக வரைந்துள்ளீர்கள். மேலும் <xliff:g id="NUMBER_1">%2$d</xliff:g> தோல்வி முயற்சிகளுக்குப் பிறகு, மின்னஞ்சல் கணக்கைப் பயன்படுத்தி உங்கள் மொபைலைத் திறக்கக் கேட்கப்படுவீர்கள்.\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> வினாடிகள் கழித்து முயற்சிக்கவும்."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="default" msgid="5270861875006378092">"அன்லாக் வடிவத்தை <xliff:g id="NUMBER_0">%1$d</xliff:g> முறை தவறாக வரைந்துள்ளீர்கள். மேலும் <xliff:g id="NUMBER_1">%2$d</xliff:g> தோல்வி முயற்சிகளுக்குப் பிறகு, மின்னஞ்சல் கணக்கைப் பயன்படுத்தி உங்கள் மொபைலை அன்லாக் செய்யக் கேட்கப்படுவீர்கள்.\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> வினாடிகள் கழித்து முயற்சிக்கவும்."</string>
<string name="kg_text_message_separator" product="default" msgid="4503708889934976866">" — "</string>
<string name="kg_reordering_delete_drop_target_text" msgid="2034358143731750914">"அகற்று"</string>
<string name="safe_media_volume_warning" product="default" msgid="3751676824423049994">"பரிந்துரைத்த அளவை விட ஒலியை அதிகரிக்கவா?\n\nநீண்ட நேரத்திற்கு அதிகளவில் ஒலி கேட்பது கேட்கும் திறனைப் பாதிக்கலாம்."</string>
@@ -1992,7 +1992,7 @@
<string name="new_sms_notification_content" msgid="3197949934153460639">"பார்க்க, SMS பயன்பாட்டைத் திறக்கவும்"</string>
<string name="profile_encrypted_title" msgid="9001208667521266472">"சில செயலுக்கு கட்டுப்பாடு இருக்கலாம்"</string>
<string name="profile_encrypted_detail" msgid="5279730442756849055">"பணிக் கணக்கு பூட்டியுள்ளது"</string>
- <string name="profile_encrypted_message" msgid="1128512616293157802">"பணிக் கணக்கை திறக்க, தட்டுக"</string>
+ <string name="profile_encrypted_message" msgid="1128512616293157802">"பணிக் கணக்கை அன்லாக் செய்யத் தட்டுக"</string>
<string name="usb_mtp_launch_notification_title" msgid="774319638256707227">"<xliff:g id="PRODUCT_NAME">%1$s</xliff:g> உடன் இணைக்கப்பட்டது"</string>
<string name="usb_mtp_launch_notification_description" msgid="6942535713629852684">"கோப்புகளைப் பார்க்க, தட்டவும்"</string>
<string name="pin_target" msgid="8036028973110156895">"பின் செய்"</string>
diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml
index d2ff9d8..b35ddab 100644
--- a/core/res/res/values-th/strings.xml
+++ b/core/res/res/values-th/strings.xml
@@ -613,10 +613,8 @@
</string-array>
<string name="fingerprint_icon_content_description" msgid="4741068463175388817">"ไอคอนลายนิ้วมือ"</string>
<string name="face_recalibrate_notification_name" msgid="7311163114750748686">"การปลดล็อกด้วยใบหน้า"</string>
- <!-- no translation found for face_recalibrate_notification_title (2524791952735579082) -->
- <skip />
- <!-- no translation found for face_recalibrate_notification_content (3064513770251355594) -->
- <skip />
+ <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"มีปัญหาเกี่ยวกับฟีเจอร์ปลดล็อกด้วยใบหน้า"</string>
+ <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"แตะเพื่อลบรูปแบบใบหน้า แล้วเพิ่มใบหน้าอีกครั้ง"</string>
<string name="face_setup_notification_title" msgid="8843461561970741790">"ตั้งค่าการปลดล็อกด้วยใบหน้า"</string>
<string name="face_setup_notification_content" msgid="5463999831057751676">"ปลดล็อกโทรศัพท์โดยมองไปที่โทรศัพท์"</string>
<string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"ตั้งค่าการปลดล็อกด้วยวิธีอื่น"</string>
diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml
index 30a8042..d28a73d 100644
--- a/core/res/res/values-tl/strings.xml
+++ b/core/res/res/values-tl/strings.xml
@@ -602,8 +602,7 @@
<string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"Walang naka-enroll na fingerprint."</string>
<string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"Walang sensor ng fingerprint ang device na ito."</string>
<string name="fingerprint_error_security_update_required" msgid="7750187320640856433">"Pansamantalang na-disable ang sensor."</string>
- <!-- no translation found for fingerprint_error_bad_calibration (4385512597740168120) -->
- <skip />
+ <string name="fingerprint_error_bad_calibration" msgid="4385512597740168120">"Hindi magamit ang sensor para sa fingerprint. Bumisita sa provider ng pag-aayos"</string>
<string name="fingerprint_name_template" msgid="8941662088160289778">"Daliri <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string name="fingerprint_app_setting_name" msgid="4253767877095495844">"Gumamit ng fingerprint"</string>
<string name="fingerprint_or_screen_lock_app_setting_name" msgid="3501743523487644907">"Gumamit ng fingerprint o lock ng screen"</string>
@@ -619,12 +618,9 @@
<string name="face_setup_notification_content" msgid="5463999831057751676">"I-unlock ang iyong telepono sa pamamagitan ng pagtingin dito"</string>
<string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Mag-set up ng higit pang paraan para mag-unlock"</string>
<string name="fingerprint_setup_notification_content" msgid="205578121848324852">"I-tap para magdagdag ng fingerprint"</string>
- <!-- no translation found for fingerprint_recalibrate_notification_name (1414578431898579354) -->
- <skip />
- <!-- no translation found for fingerprint_recalibrate_notification_title (2406561052064558497) -->
- <skip />
- <!-- no translation found for fingerprint_recalibrate_notification_content (8519935717822194943) -->
- <skip />
+ <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Pag-unlock Gamit ang Fingerprint"</string>
+ <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"Hindi magamit ang sensor para sa fingerprint"</string>
+ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Bumisita sa provider ng pag-aayos."</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"Hindi makakuha ng tamang face data. Subukang muli."</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"Masyadong maliwanag. Subukang bawasan ang liwanag."</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"Masyadong madilim. Subukan sa mas maliwanag."</string>
diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml
index e864e2b..b7afbde 100644
--- a/core/res/res/values-tr/strings.xml
+++ b/core/res/res/values-tr/strings.xml
@@ -602,8 +602,7 @@
<string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"Parmak izi kaydedilmedi."</string>
<string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"Bu cihazda parmak izi sensörü yok."</string>
<string name="fingerprint_error_security_update_required" msgid="7750187320640856433">"Sensör geçici olarak devre dışı bırakıldı."</string>
- <!-- no translation found for fingerprint_error_bad_calibration (4385512597740168120) -->
- <skip />
+ <string name="fingerprint_error_bad_calibration" msgid="4385512597740168120">"Parmak izi sensörü kullanılamıyor. Bir onarım hizmeti sağlayıcıyı ziyaret edin"</string>
<string name="fingerprint_name_template" msgid="8941662088160289778">"<xliff:g id="FINGERID">%d</xliff:g>. parmak"</string>
<string name="fingerprint_app_setting_name" msgid="4253767877095495844">"Parmak izi kullan"</string>
<string name="fingerprint_or_screen_lock_app_setting_name" msgid="3501743523487644907">"Parmak izi veya ekran kilidi kullan"</string>
@@ -619,12 +618,9 @@
<string name="face_setup_notification_content" msgid="5463999831057751676">"Telefonunuza bakarak kilidini açın"</string>
<string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Kilidi açmak için daha fazla yöntem ayarlayın"</string>
<string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Parmak izi eklemek için dokunun"</string>
- <!-- no translation found for fingerprint_recalibrate_notification_name (1414578431898579354) -->
- <skip />
- <!-- no translation found for fingerprint_recalibrate_notification_title (2406561052064558497) -->
- <skip />
- <!-- no translation found for fingerprint_recalibrate_notification_content (8519935717822194943) -->
- <skip />
+ <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Parmak İzi Kilidi"</string>
+ <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"Parmak izi sensörü kullanılamıyor"</string>
+ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Bir onarım hizmeti sağlayıcıyı ziyaret edin."</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"Doğru yüz verileri yakalanamadı. Tekrar deneyin."</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"Çok parlak. Parlaklığı daha az bir ışıklandırma deneyin."</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"Çok karanlık. Daha parlak ışıkta deneyin."</string>
diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml
index d0e41c1..050eb96 100644
--- a/core/res/res/values-vi/strings.xml
+++ b/core/res/res/values-vi/strings.xml
@@ -602,8 +602,7 @@
<string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"Chưa đăng ký vân tay."</string>
<string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"Thiết bị này không có cảm biến vân tay."</string>
<string name="fingerprint_error_security_update_required" msgid="7750187320640856433">"Đã tạm thời tắt cảm biến."</string>
- <!-- no translation found for fingerprint_error_bad_calibration (4385512597740168120) -->
- <skip />
+ <string name="fingerprint_error_bad_calibration" msgid="4385512597740168120">"Không thể dùng cảm biến vân tay. Hãy liên hệ với một nhà cung cấp dịch vụ sửa chữa"</string>
<string name="fingerprint_name_template" msgid="8941662088160289778">"Ngón tay <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string name="fingerprint_app_setting_name" msgid="4253767877095495844">"Dùng vân tay"</string>
<string name="fingerprint_or_screen_lock_app_setting_name" msgid="3501743523487644907">"Dùng vân tay hoặc phương thức khóa màn hình"</string>
@@ -619,12 +618,9 @@
<string name="face_setup_notification_content" msgid="5463999831057751676">"Mở khóa điện thoại bằng cách nhìn vào điện thoại"</string>
<string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Thiết lập thêm những cách mở khóa khác"</string>
<string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Nhấn để thêm vân tay"</string>
- <!-- no translation found for fingerprint_recalibrate_notification_name (1414578431898579354) -->
- <skip />
- <!-- no translation found for fingerprint_recalibrate_notification_title (2406561052064558497) -->
- <skip />
- <!-- no translation found for fingerprint_recalibrate_notification_content (8519935717822194943) -->
- <skip />
+ <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Mở khóa bằng vân tay"</string>
+ <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"Không thể dùng cảm biến vân tay"</string>
+ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Hãy liên hệ với một nhà cung cấp dịch vụ sửa chữa."</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"Không thể ghi lại đúng dữ liệu mặt. Hãy thử lại."</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"Quá sáng. Hãy thử giảm độ sáng."</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"Quá tối. Hãy thử tăng độ sáng."</string>
diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml
index 365fefe..c2bce46 100644
--- a/core/res/res/values-zh-rHK/strings.xml
+++ b/core/res/res/values-zh-rHK/strings.xml
@@ -602,8 +602,7 @@
<string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"未註冊任何指紋"</string>
<string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"此裝置沒有指紋感應器。"</string>
<string name="fingerprint_error_security_update_required" msgid="7750187320640856433">"感應器已暫時停用。"</string>
- <!-- no translation found for fingerprint_error_bad_calibration (4385512597740168120) -->
- <skip />
+ <string name="fingerprint_error_bad_calibration" msgid="4385512597740168120">"指紋感應器無法使用,請洽詢維修供應商"</string>
<string name="fingerprint_name_template" msgid="8941662088160289778">"手指 <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string name="fingerprint_app_setting_name" msgid="4253767877095495844">"使用指紋鎖定"</string>
<string name="fingerprint_or_screen_lock_app_setting_name" msgid="3501743523487644907">"使用指紋或螢幕鎖定"</string>
@@ -619,12 +618,9 @@
<string name="face_setup_notification_content" msgid="5463999831057751676">"直望手機即可解鎖"</string>
<string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"設定更多解鎖方法"</string>
<string name="fingerprint_setup_notification_content" msgid="205578121848324852">"輕按即可新增指紋"</string>
- <!-- no translation found for fingerprint_recalibrate_notification_name (1414578431898579354) -->
- <skip />
- <!-- no translation found for fingerprint_recalibrate_notification_title (2406561052064558497) -->
- <skip />
- <!-- no translation found for fingerprint_recalibrate_notification_content (8519935717822194943) -->
- <skip />
+ <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"指紋解鎖"</string>
+ <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"指紋感應器無法使用"</string>
+ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"請洽詢維修供應商。"</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"無法擷取準確的臉容資料。請再試一次。"</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"影像太亮。請嘗試在更暗的環境下使用。"</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"影像太暗。請嘗試在更明亮的環境下使用。"</string>
diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml
index ff4ee60..0dae86f 100644
--- a/core/res/res/values-zh-rTW/strings.xml
+++ b/core/res/res/values-zh-rTW/strings.xml
@@ -602,8 +602,7 @@
<string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"未登錄任何指紋。"</string>
<string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"這個裝置沒有指紋感應器。"</string>
<string name="fingerprint_error_security_update_required" msgid="7750187320640856433">"感應器已暫時停用。"</string>
- <!-- no translation found for fingerprint_error_bad_calibration (4385512597740168120) -->
- <skip />
+ <string name="fingerprint_error_bad_calibration" msgid="4385512597740168120">"指紋感應器無法使用,請洽詢維修供應商"</string>
<string name="fingerprint_name_template" msgid="8941662088160289778">"手指 <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string name="fingerprint_app_setting_name" msgid="4253767877095495844">"使用指紋"</string>
<string name="fingerprint_or_screen_lock_app_setting_name" msgid="3501743523487644907">"使用指紋或螢幕鎖定功能"</string>
@@ -619,12 +618,9 @@
<string name="face_setup_notification_content" msgid="5463999831057751676">"看著手機就能解鎖"</string>
<string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"設定更多解鎖方式"</string>
<string name="fingerprint_setup_notification_content" msgid="205578121848324852">"輕觸即可新增指紋"</string>
- <!-- no translation found for fingerprint_recalibrate_notification_name (1414578431898579354) -->
- <skip />
- <!-- no translation found for fingerprint_recalibrate_notification_title (2406561052064558497) -->
- <skip />
- <!-- no translation found for fingerprint_recalibrate_notification_content (8519935717822194943) -->
- <skip />
+ <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"指紋解鎖"</string>
+ <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"指紋感應器無法使用"</string>
+ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"請洽詢維修供應商。"</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"無法擷取精準臉孔資料,請再試一次。"</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"亮度過高,請嘗試使用較柔和的照明方式。"</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"亮度不足,請嘗試使用較明亮的照明方式。"</string>
diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml
index 6b0a1d1..7ff6bb3 100644
--- a/core/res/res/values-zu/strings.xml
+++ b/core/res/res/values-zu/strings.xml
@@ -602,8 +602,7 @@
<string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"Azikho izigxivizo zeminwe ezibhalisiwe."</string>
<string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"Le divayisi ayinayo inzwa yezigxivizo zeminwe."</string>
<string name="fingerprint_error_security_update_required" msgid="7750187320640856433">"Inzwa ikhutshazwe okwesikhashana."</string>
- <!-- no translation found for fingerprint_error_bad_calibration (4385512597740168120) -->
- <skip />
+ <string name="fingerprint_error_bad_calibration" msgid="4385512597740168120">"Ayikwazi ukusebenzisa inzwa yesigxivizo somunwe. Vakashela umhlinzeki wokulungisa"</string>
<string name="fingerprint_name_template" msgid="8941662088160289778">"Umunwe ongu-<xliff:g id="FINGERID">%d</xliff:g>"</string>
<string name="fingerprint_app_setting_name" msgid="4253767877095495844">"Sebenzisa izigxivizo zeminwe"</string>
<string name="fingerprint_or_screen_lock_app_setting_name" msgid="3501743523487644907">"Sebenzisa izigxivizo zeminwe noma ukukhiya isikrini"</string>
@@ -619,12 +618,9 @@
<string name="face_setup_notification_content" msgid="5463999831057751676">"Vula ifoni yakho ngokuyibheka"</string>
<string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Setha izindlela eziningi zokuvula"</string>
<string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Thepha ukuze ungeze izigxivizo zomunwe"</string>
- <!-- no translation found for fingerprint_recalibrate_notification_name (1414578431898579354) -->
- <skip />
- <!-- no translation found for fingerprint_recalibrate_notification_title (2406561052064558497) -->
- <skip />
- <!-- no translation found for fingerprint_recalibrate_notification_content (8519935717822194943) -->
- <skip />
+ <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Ukuvula ngesigxivizo somunwe"</string>
+ <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"Ayikwazi ukusebenzisa inzwa yesigxivizo somunwe"</string>
+ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Vakashela umhlinzeki wokulungisa."</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"Ayikwazanga ukuthwebula idatha enembile yobuso. Zama futhi."</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"Kukhanya kakhulu. Zama ukukhanya okuthambile."</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"Kumnyama kakhulu Zama ukukhanyisa okukhanyayo."</string>
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index d1a5cc4..cbc37b4 100644
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -444,12 +444,6 @@
<string name="sensor_notification_service">Sensor Notification Service</string>
<!-- Attribution for Twilight service. [CHAR LIMIT=NONE]-->
<string name="twilight_service">Twilight Service</string>
- <!-- Attribution for the Offline LocationTimeZoneProvider service, i.e. the service capable of
- performing time zone detection using time zone geospatial information held on the device.
- This text is shown in UIs related to an application name to help users and developers to
- understand which sub-unit of an application is requesting permissions and using power.
- [CHAR LIMIT=NONE]-->
- <string name="offline_location_time_zone_detection_service_attribution">Time Zone Detector (No connectivity)</string>
<!-- Attribution for Gnss Time Update service. [CHAR LIMIT=NONE]-->
<string name="gnss_time_update_service">GNSS Time Update Service</string>
diff --git a/core/tests/coretests/Android.bp b/core/tests/coretests/Android.bp
index 8fae80d..93e4a29 100644
--- a/core/tests/coretests/Android.bp
+++ b/core/tests/coretests/Android.bp
@@ -121,8 +121,6 @@
":FrameworksCoreTests_keyset_splat_api",
":FrameworksCoreTests_locales",
":FrameworksCoreTests_overlay_config",
- ":FrameworksCoreTests_res_version_after",
- ":FrameworksCoreTests_res_version_before",
":FrameworksCoreTests_version_1",
":FrameworksCoreTests_version_1_diff",
":FrameworksCoreTests_version_1_nosys",
diff --git a/core/tests/coretests/apks/res_upgrade/Android.bp b/core/tests/coretests/apks/res_upgrade/Android.bp
deleted file mode 100644
index c58614f..0000000
--- a/core/tests/coretests/apks/res_upgrade/Android.bp
+++ /dev/null
@@ -1,22 +0,0 @@
-package {
- // See: http://go/android-license-faq
- // A large-scale-change added 'default_applicable_licenses' to import
- // all of the 'license_kinds' from "frameworks_base_license"
- // to get the below license kinds:
- // SPDX-license-identifier-Apache-2.0
- default_applicable_licenses: ["frameworks_base_license"],
-}
-
-android_test_helper_app {
- name: "FrameworksCoreTests_res_version_before",
- defaults: ["FrameworksCoreTests_apks_defaults"],
- resource_dirs: ["res_before"],
- certificate: ":FrameworksCoreTests_unit_test_cert",
-}
-
-android_test_helper_app {
- name: "FrameworksCoreTests_res_version_after",
- defaults: ["FrameworksCoreTests_apks_defaults"],
- resource_dirs: ["res_after"],
- certificate: ":FrameworksCoreTests_unit_test_cert",
-}
diff --git a/core/tests/coretests/apks/res_upgrade/AndroidManifest.xml b/core/tests/coretests/apks/res_upgrade/AndroidManifest.xml
deleted file mode 100644
index 1c607c9..0000000
--- a/core/tests/coretests/apks/res_upgrade/AndroidManifest.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ Copyright (C) 2021 The Android Open Source Project
- ~
- ~ Licensed under the Apache License, Version 2.0 (the "License");
- ~ you may not use this file except in compliance with the License.
- ~ You may obtain a copy of the License at
- ~
- ~ http://www.apache.org/licenses/LICENSE-2.0
- ~
- ~ Unless required by applicable law or agreed to in writing, software
- ~ distributed under the License is distributed on an "AS IS" BASIS,
- ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ~ See the License for the specific language governing permissions and
- ~ limitations under the License.
- -->
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.android.frameworks.coretests.res_version">
- <application android:hasCode="false"/>
-</manifest>
diff --git a/core/tests/coretests/apks/res_upgrade/res_before/values/values.xml b/core/tests/coretests/apks/res_upgrade/res_before/values/values.xml
deleted file mode 100644
index 63fc790..0000000
--- a/core/tests/coretests/apks/res_upgrade/res_before/values/values.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<!--
- ~ Copyright (C) 2021 The Android Open Source Project
- ~
- ~ Licensed under the Apache License, Version 2.0 (the "License");
- ~ you may not use this file except in compliance with the License.
- ~ You may obtain a copy of the License at
- ~
- ~ http://www.apache.org/licenses/LICENSE-2.0
- ~
- ~ Unless required by applicable law or agreed to in writing, software
- ~ distributed under the License is distributed on an "AS IS" BASIS,
- ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ~ See the License for the specific language governing permissions and
- ~ limitations under the License.
- -->
-
-<resources>
- <string name="version">before</string>
- <public type="string" name="version" id="0x7f010000"/>
-</resources>
diff --git a/core/tests/coretests/src/android/content/ContextTest.java b/core/tests/coretests/src/android/content/ContextTest.java
index 8488a84..d1776fb 100644
--- a/core/tests/coretests/src/android/content/ContextTest.java
+++ b/core/tests/coretests/src/android/content/ContextTest.java
@@ -25,23 +25,15 @@
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotEquals;
-import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import android.app.ActivityThread;
-import android.app.PendingIntent;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageInstaller;
-import android.content.pm.PackageManager;
import android.content.res.Configuration;
-import android.content.res.Resources;
import android.graphics.PixelFormat;
import android.hardware.display.DisplayManager;
import android.hardware.display.VirtualDisplay;
import android.inputmethodservice.InputMethodService;
import android.media.ImageReader;
-import android.os.FileUtils;
import android.os.UserHandle;
import android.view.Display;
@@ -50,20 +42,12 @@
import androidx.test.filters.SmallTest;
import androidx.test.platform.app.InstrumentationRegistry;
-import com.android.compatibility.common.util.ShellIdentityUtils;
-import com.android.frameworks.coretests.R;
-
import org.junit.Test;
import org.junit.runner.RunWith;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.concurrent.ArrayBlockingQueue;
-import java.util.concurrent.TimeUnit;
-
/**
- * Build/Install/Run:
- * atest FrameworksCoreTests:ContextTest
+ * Build/Install/Run:
+ * atest FrameworksCoreTests:ContextTest
*/
@SmallTest
@RunWith(AndroidJUnit4.class)
@@ -232,132 +216,6 @@
assertFalse(context.isUiContext());
}
- private static class TestReceiver extends BroadcastReceiver implements AutoCloseable {
- private static final String INTENT_ACTION = "com.android.server.pm.test.test_app.action";
- private final ArrayBlockingQueue<Intent> mResults = new ArrayBlockingQueue<>(1);
-
- public IntentSender makeIntentSender() {
- return PendingIntent.getBroadcast(getContext(), 0, new Intent(INTENT_ACTION),
- PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_MUTABLE_UNAUDITED)
- .getIntentSender();
- }
-
- public void waitForIntent() throws InterruptedException {
- assertNotNull(mResults.poll(30, TimeUnit.SECONDS));
- }
-
- @Override
- public void onReceive(Context context, Intent intent) {
- mResults.add(intent);
- }
-
- public void register() {
- getContext().registerReceiver(this, new IntentFilter(INTENT_ACTION));
- }
-
- @Override
- public void close() throws Exception {
- getContext().unregisterReceiver(this);
- }
-
- private Context getContext() {
- return InstrumentationRegistry.getInstrumentation().getContext();
- }
- }
-
- @Test
- public void applicationContextBeforeAndAfterUpgrade() throws Exception {
- final Context context = InstrumentationRegistry.getInstrumentation().getContext();
- final String testPackageName = "com.android.frameworks.coretests.res_version";
- try {
- final PackageManager pm = context.getPackageManager();
- final int versionRes = 0x7f010000;
-
- final Context appContext = ApplicationProvider.getApplicationContext();
- installApk(appContext, R.raw.res_version_before);
-
- ApplicationInfo info = pm.getApplicationInfo(testPackageName, 0);
- final Context beforeContext = appContext.createApplicationContext(info, 0);
- assertEquals("before", beforeContext.getResources().getString(versionRes));
-
- installApk(appContext, R.raw.res_version_after);
-
- info = pm.getApplicationInfo(testPackageName, 0);
- final Context afterContext = appContext.createApplicationContext(info, 0);
- assertEquals("before", beforeContext.createConfigurationContext(Configuration.EMPTY)
- .getResources().getString(versionRes));
- assertEquals("after", afterContext.createConfigurationContext(Configuration.EMPTY)
- .getResources().getString(versionRes));
- assertNotEquals(beforeContext.getPackageResourcePath(),
- afterContext.getPackageResourcePath());
- } finally {
- uninstallPackage(context, testPackageName);
- }
- }
-
- @Test
- public void packageContextBeforeAndAfterUpgrade() throws Exception {
- final Context context = InstrumentationRegistry.getInstrumentation().getContext();
- final String testPackageName = "com.android.frameworks.coretests.res_version";
- try {
- final int versionRes = 0x7f010000;
- final Context appContext = ApplicationProvider.getApplicationContext();
- installApk(appContext, R.raw.res_version_before);
-
- final Context beforeContext = appContext.createPackageContext(testPackageName, 0);
- assertEquals("before", beforeContext.getResources().getString(versionRes));
-
- installApk(appContext, R.raw.res_version_after);
-
- final Context afterContext = appContext.createPackageContext(testPackageName, 0);
- assertEquals("before", beforeContext.createConfigurationContext(Configuration.EMPTY)
- .getResources().getString(versionRes));
- assertEquals("after", afterContext.createConfigurationContext(Configuration.EMPTY)
- .getResources().getString(versionRes));
- assertNotEquals(beforeContext.getPackageResourcePath(),
- afterContext.getPackageResourcePath());
- } finally {
- uninstallPackage(context, testPackageName);
- }
- }
-
- private void installApk(Context context, int rawApkResId) throws Exception {
- final PackageManager pm = context.getPackageManager();
- final PackageInstaller pi = pm.getPackageInstaller();
- final PackageInstaller.SessionParams params = new PackageInstaller.SessionParams(
- PackageInstaller.SessionParams.MODE_FULL_INSTALL);
- final int sessionId = pi.createSession(params);
-
- try (PackageInstaller.Session session = pi.openSession(sessionId)) {
- // Copy the apk to the install session.
- final Resources resources = context.getResources();
- try (InputStream is = resources.openRawResource(rawApkResId);
- OutputStream sessionOs = session.openWrite("base", 0, -1)) {
- FileUtils.copy(is, sessionOs);
- }
-
- // Wait for the installation to finish
- try (TestReceiver receiver = new TestReceiver()) {
- receiver.register();
- ShellIdentityUtils.invokeMethodWithShellPermissions(session,
- (s) -> {
- s.commit(receiver.makeIntentSender());
- return true;
- });
- receiver.waitForIntent();
- }
- }
- }
-
- private void uninstallPackage(Context context, String packageName) throws Exception {
- try (TestReceiver receiver = new TestReceiver()) {
- receiver.register();
- final PackageInstaller pi = context.getPackageManager().getPackageInstaller();
- pi.uninstall(packageName, receiver.makeIntentSender());
- receiver.waitForIntent();
- }
- }
-
private Context createUiContext() {
final Context appContext = ApplicationProvider.getApplicationContext();
final DisplayManager displayManager = appContext.getSystemService(DisplayManager.class);
diff --git a/data/etc/privapp-permissions-platform.xml b/data/etc/privapp-permissions-platform.xml
index 12eb50e..6385952 100644
--- a/data/etc/privapp-permissions-platform.xml
+++ b/data/etc/privapp-permissions-platform.xml
@@ -496,6 +496,8 @@
<permission name="android.permission.CONNECTIVITY_USE_RESTRICTED_NETWORKS" />
<!-- Permission required for CTS test - CtsAlarmManagerTestCases -->
<permission name="android.permission.UPDATE_DEVICE_STATS" />
+ <!-- Permission required for GTS test - PendingSystemUpdateTest -->
+ <permission name="android.permission.NOTIFY_PENDING_SYSTEM_UPDATE" />
</privapp-permissions>
<privapp-permissions package="com.android.statementservice">
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/DividerView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/DividerView.java
index 7e4010d..362b40f 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/DividerView.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/DividerView.java
@@ -408,7 +408,7 @@
}
boolean isHidden() {
- return mSurfaceHidden;
+ return getVisibility() != View.VISIBLE || mSurfaceHidden;
}
/** Starts dragging the divider bar. */
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenController.java
index 261ff2f..ea2fc1a 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenController.java
@@ -146,10 +146,8 @@
new LegacySplitDisplayLayout(mContext, displayLayout, mSplits);
sdl.rotateTo(toRotation);
mRotateSplitLayout = sdl;
- final int position = isDividerVisible()
- ? (mMinimized ? mView.mSnapTargetBeforeMinimized.position
- : mView.getCurrentPosition())
- // snap resets to middle target when not in split-mode
+ // snap resets to middle target when not minimized and rotation changed.
+ final int position = mMinimized ? mView.mSnapTargetBeforeMinimized.position
: sdl.getSnapAlgorithm().getMiddleTarget().position;
DividerSnapAlgorithm snap = sdl.getSnapAlgorithm();
final DividerSnapAlgorithm.SnapTarget target =
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipBoundsAlgorithm.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipBoundsAlgorithm.java
index 046c320..a4b866aa 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipBoundsAlgorithm.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipBoundsAlgorithm.java
@@ -19,6 +19,7 @@
import static android.util.TypedValue.COMPLEX_UNIT_DIP;
import android.annotation.NonNull;
+import android.annotation.Nullable;
import android.app.PictureInPictureParams;
import android.content.Context;
import android.content.pm.ActivityInfo;
@@ -454,6 +455,56 @@
}
/**
+ * @return the normal bounds adjusted so that they fit the menu actions.
+ */
+ public Rect adjustNormalBoundsToFitMenu(@NonNull Rect normalBounds,
+ @Nullable Size minMenuSize) {
+ if (minMenuSize == null) {
+ return normalBounds;
+ }
+ if (normalBounds.width() >= minMenuSize.getWidth()
+ && normalBounds.height() >= minMenuSize.getHeight()) {
+ // The normal bounds can fit the menu as is, no need to adjust the bounds.
+ return normalBounds;
+ }
+ final Rect adjustedNormalBounds = new Rect();
+ final boolean needsWidthAdj = minMenuSize.getWidth() > normalBounds.width();
+ final boolean needsHeightAdj = minMenuSize.getHeight() > normalBounds.height();
+ final int adjWidth;
+ final int adjHeight;
+ if (needsWidthAdj && needsHeightAdj) {
+ // Both the width and the height are too small - find the edge that needs the larger
+ // adjustment and scale that edge. The other edge will scale beyond the minMenuSize
+ // when the aspect ratio is applied.
+ final float widthScaleFactor =
+ ((float) (minMenuSize.getWidth())) / ((float) (normalBounds.width()));
+ final float heightScaleFactor =
+ ((float) (minMenuSize.getHeight())) / ((float) (normalBounds.height()));
+ if (widthScaleFactor > heightScaleFactor) {
+ adjWidth = minMenuSize.getWidth();
+ adjHeight = Math.round(adjWidth / mPipBoundsState.getAspectRatio());
+ } else {
+ adjHeight = minMenuSize.getHeight();
+ adjWidth = Math.round(adjHeight * mPipBoundsState.getAspectRatio());
+ }
+ } else if (needsWidthAdj) {
+ // Width is too small - use the min menu size width instead.
+ adjWidth = minMenuSize.getWidth();
+ adjHeight = Math.round(adjWidth / mPipBoundsState.getAspectRatio());
+ } else {
+ // Height is too small - use the min menu size height instead.
+ adjHeight = minMenuSize.getHeight();
+ adjWidth = Math.round(adjHeight * mPipBoundsState.getAspectRatio());
+ }
+ adjustedNormalBounds.set(0, 0, adjWidth, adjHeight);
+ // Make sure the bounds conform to the aspect ratio and min edge size.
+ transformBoundsToAspectRatio(adjustedNormalBounds,
+ mPipBoundsState.getAspectRatio(), true /* useCurrentMinEdgeSize */,
+ true /* useCurrentSize */);
+ return adjustedNormalBounds;
+ }
+
+ /**
* Dumps internal states.
*/
public void dump(PrintWriter pw, String prefix) {
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java
index 324a6e2..f367cd6 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java
@@ -722,6 +722,14 @@
if (info.displayId != Display.DEFAULT_DISPLAY && mOnDisplayIdChangeCallback != null) {
mOnDisplayIdChangeCallback.accept(Display.DEFAULT_DISPLAY);
}
+
+ final PipAnimationController.PipTransitionAnimator animator =
+ mPipAnimationController.getCurrentAnimator();
+ if (animator != null) {
+ animator.removeAllUpdateListeners();
+ animator.removeAllListeners();
+ animator.cancel();
+ }
}
@Override
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipTouchHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipTouchHandler.java
index b1086c5..0bcd1a3 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipTouchHandler.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipTouchHandler.java
@@ -726,12 +726,17 @@
}
private void animateToNormalSize(Runnable callback) {
+ // Save the current bounds as the user-resize bounds.
mPipResizeGestureHandler.setUserResizeBounds(mPipBoundsState.getBounds());
- final Rect normalBounds = new Rect(mPipBoundsState.getNormalBounds());
+
+ final Size minMenuSize = mMenuController.getEstimatedMinMenuSize();
+ final Rect normalBounds = mPipBoundsState.getNormalBounds();
+ final Rect destBounds = mPipBoundsAlgorithm.adjustNormalBoundsToFitMenu(normalBounds,
+ minMenuSize);
Rect restoredMovementBounds = new Rect();
- mPipBoundsAlgorithm.getMovementBounds(normalBounds,
+ mPipBoundsAlgorithm.getMovementBounds(destBounds,
mInsetBounds, restoredMovementBounds, mIsImeShowing ? mImeHeight : 0);
- mSavedSnapFraction = mMotionHelper.animateToExpandedState(normalBounds,
+ mSavedSnapFraction = mMotionHelper.animateToExpandedState(destBounds,
mPipBoundsState.getMovementBounds(), restoredMovementBounds, callback);
}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashScreenExitAnimation.java b/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashScreenExitAnimation.java
index 9986154..4e477ca1 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashScreenExitAnimation.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashScreenExitAnimation.java
@@ -85,7 +85,10 @@
}
View iconView = view.getIconView();
- if (iconView == null || iconView.getBackground() == null) {
+
+ // If the icon and the background are invisible, don't animate it
+ if (iconView == null || iconView.getLayoutParams().width == 0
+ || iconView.getLayoutParams().height == 0) {
mIconFadeOutDuration = 0;
mIconStartAlpha = 0;
mAppRevealDelay = 0;
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashscreenContentDrawer.java b/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashscreenContentDrawer.java
index df3fee0..b09d0d8 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashscreenContentDrawer.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashscreenContentDrawer.java
@@ -77,6 +77,13 @@
// For example, an icon with the foreground 108*108 opaque pixels and it's background
// also 108*108 pixels, then do not enlarge this icon if only need to show foreground icon.
private static final float ENLARGE_FOREGROUND_ICON_THRESHOLD = (72f * 72f) / (108f * 108f);
+
+ /**
+ * If the developer doesn't specify a background for the icon, we slightly scale it up.
+ *
+ * The background is either manually specified in the theme or the Adaptive Icon
+ * background is used if it's different from the window background.
+ */
private static final float NO_BACKGROUND_SCALE = 192f / 160;
private final Context mContext;
private final IconProvider mIconProvider;
@@ -228,7 +235,7 @@
attrs.mWindowBgColor = safeReturnAttrDefault((def) -> typedArray.getColor(
R.styleable.Window_windowSplashScreenBackground, def),
Color.TRANSPARENT);
- attrs.mReplaceIcon = safeReturnAttrDefault((def) -> typedArray.getDrawable(
+ attrs.mSplashScreenIcon = safeReturnAttrDefault((def) -> typedArray.getDrawable(
R.styleable.Window_windowSplashScreenAnimatedIcon), null);
attrs.mAnimationDuration = safeReturnAttrDefault((def) -> typedArray.getInt(
R.styleable.Window_windowSplashScreenAnimationDuration, def), 0);
@@ -241,7 +248,7 @@
if (DEBUG) {
Slog.d(TAG, "window attributes color: "
+ Integer.toHexString(attrs.mWindowBgColor)
- + " icon " + attrs.mReplaceIcon + " duration " + attrs.mAnimationDuration
+ + " icon " + attrs.mSplashScreenIcon + " duration " + attrs.mAnimationDuration
+ " brandImage " + attrs.mBrandingImage);
}
}
@@ -250,7 +257,7 @@
public static class SplashScreenWindowAttrs {
private int mWindowBgResId = 0;
private int mWindowBgColor = Color.TRANSPARENT;
- private Drawable mReplaceIcon = null;
+ private Drawable mSplashScreenIcon = null;
private Drawable mBrandingImage = null;
private int mIconBgColor = Color.TRANSPARENT;
private int mAnimationDuration = 0;
@@ -287,10 +294,15 @@
// empty splash screen case
animationDuration = 0;
mFinalIconSize = 0;
- } else if (mTmpAttrs.mReplaceIcon != null) {
+ } else if (mTmpAttrs.mSplashScreenIcon != null) {
// replaced icon, don't process
- iconDrawable = mTmpAttrs.mReplaceIcon;
+ iconDrawable = mTmpAttrs.mSplashScreenIcon;
animationDuration = mTmpAttrs.mAnimationDuration;
+
+ // There is no background below the icon, so scale the icon up
+ if (mTmpAttrs.mIconBgColor == Color.TRANSPARENT) {
+ mFinalIconSize *= NO_BACKGROUND_SCALE;
+ }
createIconDrawable(iconDrawable, false);
} else {
final float iconScale = (float) mIconSize / (float) mDefaultIconSize;
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashscreenIconDrawableFactory.java b/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashscreenIconDrawableFactory.java
index dae7055..211941f 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashscreenIconDrawableFactory.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashscreenIconDrawableFactory.java
@@ -162,6 +162,7 @@
@Override
public void draw(Canvas canvas) {
+ canvas.clipPath(mMaskScaleOnly);
if (mMaskScaleOnly != null) {
canvas.drawPath(mMaskScaleOnly, mPaint);
}
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/PipBoundsAlgorithmTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/PipBoundsAlgorithmTest.java
index a0c6d11..90f898a 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/PipBoundsAlgorithmTest.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/PipBoundsAlgorithmTest.java
@@ -402,6 +402,64 @@
assertBoundsInclusionWithMargin("useDefaultBounds", defaultBounds, actualBounds);
}
+ @Test
+ public void adjustNormalBoundsToFitMenu_alreadyFits() {
+ final Rect normalBounds = new Rect(0, 0, 400, 711);
+ final Size minMenuSize = new Size(396, 292);
+ mPipBoundsState.setAspectRatio(
+ ((float) normalBounds.width()) / ((float) normalBounds.height()));
+
+ final Rect bounds =
+ mPipBoundsAlgorithm.adjustNormalBoundsToFitMenu(normalBounds, minMenuSize);
+
+ assertEquals(normalBounds, bounds);
+ }
+
+ @Test
+ public void adjustNormalBoundsToFitMenu_widthTooSmall() {
+ final Rect normalBounds = new Rect(0, 0, 297, 528);
+ final Size minMenuSize = new Size(396, 292);
+ mPipBoundsState.setAspectRatio(
+ ((float) normalBounds.width()) / ((float) normalBounds.height()));
+
+ final Rect bounds =
+ mPipBoundsAlgorithm.adjustNormalBoundsToFitMenu(normalBounds, minMenuSize);
+
+ assertEquals(minMenuSize.getWidth(), bounds.width());
+ assertEquals(minMenuSize.getWidth() / mPipBoundsState.getAspectRatio(),
+ bounds.height(), 0.3f);
+ }
+
+ @Test
+ public void adjustNormalBoundsToFitMenu_heightTooSmall() {
+ final Rect normalBounds = new Rect(0, 0, 400, 280);
+ final Size minMenuSize = new Size(396, 292);
+ mPipBoundsState.setAspectRatio(
+ ((float) normalBounds.width()) / ((float) normalBounds.height()));
+
+ final Rect bounds =
+ mPipBoundsAlgorithm.adjustNormalBoundsToFitMenu(normalBounds, minMenuSize);
+
+ assertEquals(minMenuSize.getHeight(), bounds.height());
+ assertEquals(minMenuSize.getHeight() * mPipBoundsState.getAspectRatio(),
+ bounds.width(), 0.3f);
+ }
+
+ @Test
+ public void adjustNormalBoundsToFitMenu_widthAndHeightTooSmall() {
+ final Rect normalBounds = new Rect(0, 0, 350, 280);
+ final Size minMenuSize = new Size(396, 292);
+ mPipBoundsState.setAspectRatio(
+ ((float) normalBounds.width()) / ((float) normalBounds.height()));
+
+ final Rect bounds =
+ mPipBoundsAlgorithm.adjustNormalBoundsToFitMenu(normalBounds, minMenuSize);
+
+ assertEquals(minMenuSize.getWidth(), bounds.width());
+ assertEquals(minMenuSize.getWidth() / mPipBoundsState.getAspectRatio(),
+ bounds.height(), 0.3f);
+ }
+
private void overrideDefaultAspectRatio(float aspectRatio) {
final TestableResources res = mContext.getOrCreateTestableResources();
res.addOverride(
diff --git a/libs/hwui/WebViewFunctorManager.cpp b/libs/hwui/WebViewFunctorManager.cpp
index 92e20c4..974c863 100644
--- a/libs/hwui/WebViewFunctorManager.cpp
+++ b/libs/hwui/WebViewFunctorManager.cpp
@@ -126,7 +126,14 @@
renderthread::CanvasContext::getActiveContext();
if (activeContext != nullptr) {
ASurfaceControl* rootSurfaceControl = activeContext->getSurfaceControl();
- if (rootSurfaceControl) overlayParams.overlaysMode = OverlaysMode::Enabled;
+ if (rootSurfaceControl) {
+ overlayParams.overlaysMode = OverlaysMode::Enabled;
+ int32_t rgid = activeContext->getSurfaceControlGenerationId();
+ if (mParentSurfaceControlGenerationId != rgid) {
+ reparentSurfaceControl(rootSurfaceControl);
+ mParentSurfaceControlGenerationId = rgid;
+ }
+ }
}
}
@@ -195,6 +202,7 @@
LOG_ALWAYS_FATAL_IF(rootSurfaceControl == nullptr, "Null root surface control!");
auto funcs = renderthread::RenderThread::getInstance().getASurfaceControlFunctions();
+ mParentSurfaceControlGenerationId = activeContext->getSurfaceControlGenerationId();
mSurfaceControl = funcs.createFunc(rootSurfaceControl, "Webview Overlay SurfaceControl");
ASurfaceTransaction* transaction = funcs.transactionCreateFunc();
activeContext->prepareSurfaceControlForWebview();
@@ -218,6 +226,17 @@
}
}
+void WebViewFunctor::reparentSurfaceControl(ASurfaceControl* parent) {
+ ATRACE_NAME("WebViewFunctor::reparentSurfaceControl");
+ if (mSurfaceControl == nullptr) return;
+
+ auto funcs = renderthread::RenderThread::getInstance().getASurfaceControlFunctions();
+ ASurfaceTransaction* transaction = funcs.transactionCreateFunc();
+ funcs.transactionReparentFunc(transaction, mSurfaceControl, parent);
+ mergeTransaction(transaction);
+ funcs.transactionDeleteFunc(transaction);
+}
+
WebViewFunctorManager& WebViewFunctorManager::instance() {
static WebViewFunctorManager sInstance;
return sInstance;
diff --git a/libs/hwui/WebViewFunctorManager.h b/libs/hwui/WebViewFunctorManager.h
index a84cda5..048d1fb 100644
--- a/libs/hwui/WebViewFunctorManager.h
+++ b/libs/hwui/WebViewFunctorManager.h
@@ -85,12 +85,16 @@
}
private:
+ void reparentSurfaceControl(ASurfaceControl* parent);
+
+private:
WebViewFunctorCallbacks mCallbacks;
void* const mData;
int mFunctor;
RenderMode mMode;
bool mHasContext = false;
bool mCreatedHandle = false;
+ int32_t mParentSurfaceControlGenerationId = 0;
ASurfaceControl* mSurfaceControl = nullptr;
};
diff --git a/libs/hwui/renderthread/CanvasContext.cpp b/libs/hwui/renderthread/CanvasContext.cpp
index 0c9711b..81cee61 100644
--- a/libs/hwui/renderthread/CanvasContext.cpp
+++ b/libs/hwui/renderthread/CanvasContext.cpp
@@ -201,6 +201,7 @@
funcs.releaseFunc(mSurfaceControl);
}
mSurfaceControl = surfaceControl;
+ mSurfaceControlGenerationId++;
mExpectSurfaceStats = surfaceControl != nullptr;
if (mSurfaceControl != nullptr) {
funcs.acquireFunc(mSurfaceControl);
diff --git a/libs/hwui/renderthread/CanvasContext.h b/libs/hwui/renderthread/CanvasContext.h
index 3279ccb..85af3e4 100644
--- a/libs/hwui/renderthread/CanvasContext.h
+++ b/libs/hwui/renderthread/CanvasContext.h
@@ -110,6 +110,7 @@
GrDirectContext* getGrContext() const { return mRenderThread.getGrContext(); }
ASurfaceControl* getSurfaceControl() const { return mSurfaceControl; }
+ int32_t getSurfaceControlGenerationId() const { return mSurfaceControlGenerationId; }
// Won't take effect until next EGLSurface creation
void setSwapBehavior(SwapBehavior swapBehavior);
@@ -253,6 +254,9 @@
// The SurfaceControl reference is passed from ViewRootImpl, can be set to
// NULL to remove the reference
ASurfaceControl* mSurfaceControl = nullptr;
+ // id to track surface control changes and WebViewFunctor uses it to determine
+ // whether reparenting is needed
+ int32_t mSurfaceControlGenerationId = 0;
// stopped indicates the CanvasContext will reject actual redraw operations,
// and defer repaint until it is un-stopped
bool mStopped = false;
diff --git a/libs/hwui/renderthread/RenderThread.cpp b/libs/hwui/renderthread/RenderThread.cpp
index 524407d..f83c0a4 100644
--- a/libs/hwui/renderthread/RenderThread.cpp
+++ b/libs/hwui/renderthread/RenderThread.cpp
@@ -98,6 +98,10 @@
LOG_ALWAYS_FATAL_IF(transactionApplyFunc == nullptr,
"Failed to find required symbol ASurfaceTransaction_apply!");
+ transactionReparentFunc = (AST_reparent)dlsym(handle_, "ASurfaceTransaction_reparent");
+ LOG_ALWAYS_FATAL_IF(transactionReparentFunc == nullptr,
+ "Failed to find required symbol transactionReparentFunc!");
+
transactionSetVisibilityFunc =
(AST_setVisibility)dlsym(handle_, "ASurfaceTransaction_setVisibility");
LOG_ALWAYS_FATAL_IF(transactionSetVisibilityFunc == nullptr,
diff --git a/libs/hwui/renderthread/RenderThread.h b/libs/hwui/renderthread/RenderThread.h
index c5e3746..05d225b 100644
--- a/libs/hwui/renderthread/RenderThread.h
+++ b/libs/hwui/renderthread/RenderThread.h
@@ -94,6 +94,9 @@
typedef ASurfaceTransaction* (*AST_create)();
typedef void (*AST_delete)(ASurfaceTransaction* transaction);
typedef void (*AST_apply)(ASurfaceTransaction* transaction);
+typedef void (*AST_reparent)(ASurfaceTransaction* aSurfaceTransaction,
+ ASurfaceControl* aSurfaceControl,
+ ASurfaceControl* newParentASurfaceControl);
typedef void (*AST_setVisibility)(ASurfaceTransaction* transaction,
ASurfaceControl* surface_control, int8_t visibility);
typedef void (*AST_setZOrder)(ASurfaceTransaction* transaction, ASurfaceControl* surface_control,
@@ -113,6 +116,7 @@
AST_create transactionCreateFunc;
AST_delete transactionDeleteFunc;
AST_apply transactionApplyFunc;
+ AST_reparent transactionReparentFunc;
AST_setVisibility transactionSetVisibilityFunc;
AST_setZOrder transactionSetZOrderFunc;
};
diff --git a/media/java/android/media/AudioFormat.java b/media/java/android/media/AudioFormat.java
index c8412f2..1644ec8 100644
--- a/media/java/android/media/AudioFormat.java
+++ b/media/java/android/media/AudioFormat.java
@@ -310,6 +310,10 @@
public static final int ENCODING_LEGACY_SHORT_ARRAY_THRESHOLD = ENCODING_OPUS;
/** Audio data format: PCM 24 bit per sample packed as 3 bytes.
+ *
+ * The bytes are in little-endian order, so the least significant byte
+ * comes first in the byte array.
+ *
* Not guaranteed to be supported by devices, may be emulated if not supported. */
public static final int ENCODING_PCM_24BIT_PACKED = 21;
/** Audio data format: PCM 32 bit per sample.
diff --git a/media/java/android/media/MediaRecorder.java b/media/java/android/media/MediaRecorder.java
index 1efd4c6..341bb8d 100644
--- a/media/java/android/media/MediaRecorder.java
+++ b/media/java/android/media/MediaRecorder.java
@@ -840,7 +840,7 @@
setVideoSize(profile.getWidth(), profile.getHeight());
setVideoEncodingBitRate(profile.getBitrate());
setVideoEncoder(profile.getCodec());
- if (profile.getProfile() > 0) {
+ if (profile.getProfile() >= 0) {
setVideoEncodingProfileLevel(profile.getProfile(), 0 /* level */);
}
}
@@ -1121,10 +1121,10 @@
* @throws IllegalArgumentException when an invalid profile or level value is used.
*/
public void setVideoEncodingProfileLevel(int profile, int level) {
- if (profile <= 0) {
+ if (profile < 0) {
throw new IllegalArgumentException("Video encoding profile is not positive");
}
- if (level <= 0) {
+ if (level < 0) {
throw new IllegalArgumentException("Video encoding level is not positive");
}
setParameter("video-param-encoder-profile=" + profile);
diff --git a/media/java/android/media/MediaRouter2Manager.java b/media/java/android/media/MediaRouter2Manager.java
index 915cb12..628f7ee 100644
--- a/media/java/android/media/MediaRouter2Manager.java
+++ b/media/java/android/media/MediaRouter2Manager.java
@@ -221,10 +221,24 @@
Objects.requireNonNull(packageName, "packageName must not be null");
List<RoutingSessionInfo> sessions = getRoutingSessions(packageName);
- return getAvailableRoutesForRoutingSession(sessions.get(sessions.size() - 1));
+ return getAvailableRoutes(sessions.get(sessions.size() - 1));
}
/**
+ * Gets routes that can be transferable seamlessly for an application.
+ *
+ * @param packageName the package name of the application
+ */
+ @NonNull
+ public List<MediaRoute2Info> getTransferableRoutes(@NonNull String packageName) {
+ Objects.requireNonNull(packageName, "packageName must not be null");
+
+ List<RoutingSessionInfo> sessions = getRoutingSessions(packageName);
+ return getTransferableRoutes(sessions.get(sessions.size() - 1));
+ }
+
+
+ /**
* Gets available routes for the given routing session.
* The returned routes can be passed to
* {@link #transfer(RoutingSessionInfo, MediaRoute2Info)} for transferring the routing session.
@@ -232,8 +246,7 @@
* @param sessionInfo the routing session that would be transferred
*/
@NonNull
- public List<MediaRoute2Info> getAvailableRoutesForRoutingSession(
- @NonNull RoutingSessionInfo sessionInfo) {
+ public List<MediaRoute2Info> getAvailableRoutes(@NonNull RoutingSessionInfo sessionInfo) {
Objects.requireNonNull(sessionInfo, "sessionInfo must not be null");
List<MediaRoute2Info> routes = new ArrayList<>();
@@ -256,6 +269,45 @@
}
/**
+ * Gets routes that can be transferable seamlessly for the given routing session.
+ * The returned routes can be passed to
+ * {@link #transfer(RoutingSessionInfo, MediaRoute2Info)} for transferring the routing session.
+ * <p>
+ * This includes routes that are {@link RoutingSessionInfo#getTransferableRoutes() transferable}
+ * by provider itself and routes that are different playback type (e.g. local/remote)
+ * from the given routing session.
+ *
+ * @param sessionInfo the routing session that would be transferred
+ */
+ @NonNull
+ public List<MediaRoute2Info> getTransferableRoutes(@NonNull RoutingSessionInfo sessionInfo) {
+ Objects.requireNonNull(sessionInfo, "sessionInfo must not be null");
+
+ List<MediaRoute2Info> routes = new ArrayList<>();
+
+ String packageName = sessionInfo.getClientPackageName();
+ List<String> preferredFeatures = mPreferredFeaturesMap.get(packageName);
+ if (preferredFeatures == null) {
+ preferredFeatures = Collections.emptyList();
+ }
+ synchronized (mRoutesLock) {
+ for (MediaRoute2Info route : mRoutes.values()) {
+ if (sessionInfo.getSelectedRoutes().contains(route.getId())
+ || sessionInfo.getTransferableRoutes().contains(route.getId())) {
+ routes.add(route);
+ continue;
+ }
+ // Add Phone -> Cast and Cast -> Phone
+ if (route.hasAnyFeatures(preferredFeatures)
+ && (sessionInfo.isSystemSession() ^ route.isSystemRoute())) {
+ routes.add(route);
+ }
+ }
+ }
+ return routes;
+ }
+
+ /**
* Returns the preferred features of the specified package name.
*/
@NonNull
diff --git a/packages/SettingsLib/IllustrationPreference/src/com/android/settingslib/widget/IllustrationPreference.java b/packages/SettingsLib/IllustrationPreference/src/com/android/settingslib/widget/IllustrationPreference.java
index e91dd94..f04b0e3 100644
--- a/packages/SettingsLib/IllustrationPreference/src/com/android/settingslib/widget/IllustrationPreference.java
+++ b/packages/SettingsLib/IllustrationPreference/src/com/android/settingslib/widget/IllustrationPreference.java
@@ -18,18 +18,29 @@
import android.content.Context;
import android.content.res.TypedArray;
+import android.graphics.drawable.Animatable;
+import android.graphics.drawable.Animatable2;
+import android.graphics.drawable.AnimationDrawable;
+import android.graphics.drawable.Drawable;
+import android.net.Uri;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
+import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.FrameLayout;
import android.widget.ImageView;
-import androidx.annotation.VisibleForTesting;
+import androidx.annotation.RawRes;
import androidx.preference.Preference;
import androidx.preference.PreferenceViewHolder;
+import androidx.vectordrawable.graphics.drawable.Animatable2Compat;
import com.airbnb.lottie.LottieAnimationView;
+import com.airbnb.lottie.LottieDrawable;
+
+import java.io.FileNotFoundException;
+import java.io.InputStream;
/**
* IllustrationPreference is a preference that can play lottie format animation
@@ -40,11 +51,32 @@
private static final boolean IS_ENABLED_LOTTIE_ADAPTIVE_COLOR = false;
- private int mAnimationId;
+ private int mImageResId;
private boolean mIsAutoScale;
- private LottieAnimationView mIllustrationView;
+ private Uri mImageUri;
+ private Drawable mImageDrawable;
private View mMiddleGroundView;
- private FrameLayout mMiddleGroundLayout;
+
+ private final Animatable2.AnimationCallback mAnimationCallback =
+ new Animatable2.AnimationCallback() {
+ @Override
+ public void onAnimationEnd(Drawable drawable) {
+ ((Animatable) drawable).start();
+ }
+ };
+
+ private final Animatable2Compat.AnimationCallback mAnimationCallbackCompat =
+ new Animatable2Compat.AnimationCallback() {
+ @Override
+ public void onAnimationEnd(Drawable drawable) {
+ ((Animatable) drawable).start();
+ }
+ };
+
+ public IllustrationPreference(Context context) {
+ super(context);
+ init(context, /* attrs= */ null);
+ }
public IllustrationPreference(Context context, AttributeSet attrs) {
super(context, attrs);
@@ -65,10 +97,11 @@
@Override
public void onBindViewHolder(PreferenceViewHolder holder) {
super.onBindViewHolder(holder);
- if (mAnimationId == 0) {
- Log.w(TAG, "Invalid illustration resource id.");
- return;
- }
+
+ final FrameLayout middleGroundLayout =
+ (FrameLayout) holder.findViewById(R.id.middleground_layout);
+ final LottieAnimationView illustrationView =
+ (LottieAnimationView) holder.findViewById(R.id.lottie_view);
// To solve the problem of non-compliant illustrations, we set the frame height
// to 300dp and set the length of the short side of the screen to
@@ -81,73 +114,208 @@
lp.width = screenWidth < screenHeight ? screenWidth : screenHeight;
illustrationFrame.setLayoutParams(lp);
- mMiddleGroundLayout = (FrameLayout) holder.findViewById(R.id.middleground_layout);
- mIllustrationView = (LottieAnimationView) holder.findViewById(R.id.lottie_view);
- mIllustrationView.setAnimation(mAnimationId);
- mIllustrationView.loop(true);
- mIllustrationView.playAnimation();
- if (mIsAutoScale) {
- enableAnimationAutoScale(mIsAutoScale);
- }
- if (mMiddleGroundView != null) {
- enableMiddleGroundView();
- }
- if (IS_ENABLED_LOTTIE_ADAPTIVE_COLOR) {
- ColorUtils.applyDynamicColors(getContext(), mIllustrationView);
- }
- }
+ handleImageWithAnimation(illustrationView);
- @VisibleForTesting
- boolean isAnimating() {
- return mIllustrationView.isAnimating();
+ if (mIsAutoScale) {
+ illustrationView.setScaleType(mIsAutoScale
+ ? ImageView.ScaleType.CENTER_CROP
+ : ImageView.ScaleType.CENTER_INSIDE);
+ }
+
+ handleMiddleGroundView(middleGroundLayout);
+
+ if (IS_ENABLED_LOTTIE_ADAPTIVE_COLOR) {
+ ColorUtils.applyDynamicColors(getContext(), illustrationView);
+ }
}
/**
- * Set the middle ground view to preference. The user
+ * Sets the middle ground view to preference. The user
* can overlay a view on top of the animation.
*/
public void setMiddleGroundView(View view) {
- mMiddleGroundView = view;
- if (mMiddleGroundLayout == null) {
- return;
+ if (view != mMiddleGroundView) {
+ mMiddleGroundView = view;
+ notifyChanged();
}
- enableMiddleGroundView();
}
/**
- * Remove the middle ground view of preference.
+ * Removes the middle ground view of preference.
*/
public void removeMiddleGroundView() {
- if (mMiddleGroundLayout == null) {
- return;
- }
- mMiddleGroundLayout.removeAllViews();
- mMiddleGroundLayout.setVisibility(View.GONE);
+ mMiddleGroundView = null;
+ notifyChanged();
}
/**
* Enables the auto scale feature of animation view.
*/
public void enableAnimationAutoScale(boolean enable) {
- mIsAutoScale = enable;
- if (mIllustrationView == null) {
- return;
+ if (enable != mIsAutoScale) {
+ mIsAutoScale = enable;
+ notifyChanged();
}
- mIllustrationView.setScaleType(
- mIsAutoScale ? ImageView.ScaleType.CENTER_CROP : ImageView.ScaleType.CENTER_INSIDE);
}
/**
- * Set the lottie illustration resource id.
+ * Sets the lottie illustration resource id.
*/
public void setLottieAnimationResId(int resId) {
- mAnimationId = resId;
+ if (resId != mImageResId) {
+ resetImageResourceCache();
+ mImageResId = resId;
+ notifyChanged();
+ }
}
- private void enableMiddleGroundView() {
- mMiddleGroundLayout.removeAllViews();
- mMiddleGroundLayout.addView(mMiddleGroundView);
- mMiddleGroundLayout.setVisibility(View.VISIBLE);
+ /**
+ * Sets image drawable to display image in {@link LottieAnimationView}
+ *
+ * @param imageDrawable the drawable of an image
+ */
+ public void setImageDrawable(Drawable imageDrawable) {
+ if (imageDrawable != mImageDrawable) {
+ resetImageResourceCache();
+ mImageDrawable = imageDrawable;
+ notifyChanged();
+ }
+ }
+
+ /**
+ * Sets image uri to display image in {@link LottieAnimationView}
+ *
+ * @param imageUri the Uri of an image
+ */
+ public void setImageUri(Uri imageUri) {
+ if (imageUri != mImageUri) {
+ resetImageResourceCache();
+ mImageUri = imageUri;
+ notifyChanged();
+ }
+ }
+
+ private void resetImageResourceCache() {
+ mImageDrawable = null;
+ mImageUri = null;
+ mImageResId = 0;
+ }
+
+ private void handleMiddleGroundView(ViewGroup middleGroundLayout) {
+ middleGroundLayout.removeAllViews();
+
+ if (mMiddleGroundView != null) {
+ middleGroundLayout.addView(mMiddleGroundView);
+ middleGroundLayout.setVisibility(View.VISIBLE);
+ } else {
+ middleGroundLayout.setVisibility(View.GONE);
+ }
+ }
+
+ private void handleImageWithAnimation(LottieAnimationView illustrationView) {
+ if (mImageDrawable != null) {
+ resetAnimations(illustrationView);
+ illustrationView.setImageDrawable(mImageDrawable);
+ final Drawable drawable = illustrationView.getDrawable();
+ if (drawable != null) {
+ startAnimation(drawable);
+ }
+ }
+
+ if (mImageUri != null) {
+ resetAnimations(illustrationView);
+ illustrationView.setImageURI(mImageUri);
+ final Drawable drawable = illustrationView.getDrawable();
+ if (drawable != null) {
+ startAnimation(drawable);
+ } else {
+ // The lottie image from the raw folder also returns null because the ImageView
+ // couldn't handle it now.
+ startLottieAnimationWith(illustrationView, mImageUri);
+ }
+ }
+
+ if (mImageResId > 0) {
+ resetAnimations(illustrationView);
+ illustrationView.setImageResource(mImageResId);
+ final Drawable drawable = illustrationView.getDrawable();
+ if (drawable != null) {
+ startAnimation(drawable);
+ } else {
+ // The lottie image from the raw folder also returns null because the ImageView
+ // couldn't handle it now.
+ startLottieAnimationWith(illustrationView, mImageResId);
+ }
+ }
+ }
+
+ private void startAnimation(Drawable drawable) {
+ if (!(drawable instanceof Animatable)) {
+ return;
+ }
+
+ if (drawable instanceof Animatable2) {
+ ((Animatable2) drawable).registerAnimationCallback(mAnimationCallback);
+ } else if (drawable instanceof Animatable2Compat) {
+ ((Animatable2Compat) drawable).registerAnimationCallback(mAnimationCallbackCompat);
+ } else if (drawable instanceof AnimationDrawable) {
+ ((AnimationDrawable) drawable).setOneShot(false);
+ }
+
+ ((Animatable) drawable).start();
+ }
+
+ private static void startLottieAnimationWith(LottieAnimationView illustrationView,
+ Uri imageUri) {
+ try {
+ final InputStream inputStream =
+ getInputStreamFromUri(illustrationView.getContext(), imageUri);
+ illustrationView.setAnimation(inputStream, /* cacheKey= */ null);
+ illustrationView.setRepeatCount(LottieDrawable.INFINITE);
+ illustrationView.playAnimation();
+ } catch (IllegalStateException e) {
+ Log.w(TAG, "Invalid illustration image uri: " + imageUri, e);
+ }
+ }
+
+ private static void startLottieAnimationWith(LottieAnimationView illustrationView,
+ @RawRes int rawRes) {
+ try {
+ illustrationView.setAnimation(rawRes);
+ illustrationView.setRepeatCount(LottieDrawable.INFINITE);
+ illustrationView.playAnimation();
+ } catch (IllegalStateException e) {
+ Log.w(TAG, "Invalid illustration resource id: " + rawRes, e);
+ }
+ }
+
+ private static void resetAnimations(LottieAnimationView illustrationView) {
+ resetAnimation(illustrationView.getDrawable());
+
+ illustrationView.cancelAnimation();
+ }
+
+ private static void resetAnimation(Drawable drawable) {
+ if (!(drawable instanceof Animatable)) {
+ return;
+ }
+
+ if (drawable instanceof Animatable2) {
+ ((Animatable2) drawable).clearAnimationCallbacks();
+ } else if (drawable instanceof Animatable2Compat) {
+ ((Animatable2Compat) drawable).clearAnimationCallbacks();
+ }
+
+ ((Animatable) drawable).stop();
+ }
+
+ private static InputStream getInputStreamFromUri(Context context, Uri uri) {
+ try {
+ return context.getContentResolver().openInputStream(uri);
+ } catch (FileNotFoundException e) {
+ Log.w(TAG, "Cannot find content uri: " + uri, e);
+ return null;
+ }
}
private void init(Context context, AttributeSet attrs) {
@@ -157,7 +325,7 @@
if (attrs != null) {
final TypedArray a = context.obtainStyledAttributes(attrs,
R.styleable.LottieAnimationView, 0 /*defStyleAttr*/, 0 /*defStyleRes*/);
- mAnimationId = a.getResourceId(R.styleable.LottieAnimationView_lottie_rawRes, 0);
+ mImageResId = a.getResourceId(R.styleable.LottieAnimationView_lottie_rawRes, 0);
a.recycle();
}
}
diff --git a/packages/SettingsLib/MainSwitchPreference/res/layout-v31/settingslib_main_switch_bar.xml b/packages/SettingsLib/MainSwitchPreference/res/layout-v31/settingslib_main_switch_bar.xml
index 2518a6d..6e5911c 100644
--- a/packages/SettingsLib/MainSwitchPreference/res/layout-v31/settingslib_main_switch_bar.xml
+++ b/packages/SettingsLib/MainSwitchPreference/res/layout-v31/settingslib_main_switch_bar.xml
@@ -36,9 +36,9 @@
android:layout_height="wrap_content"
android:layout_width="0dp"
android:layout_weight="1"
- android:layout_marginEnd="16dp"
+ android:layout_marginEnd="@dimen/settingslib_switch_title_margin"
+ android:layout_marginVertical="@dimen/settingslib_switch_title_margin"
android:layout_gravity="center_vertical"
- android:maxLines="2"
android:ellipsize="end"
android:textAppearance="?android:attr/textAppearanceListItem"
style="@style/MainSwitchText.Settingslib" />
diff --git a/packages/SettingsLib/MainSwitchPreference/res/layout/settingslib_main_switch_layout.xml b/packages/SettingsLib/MainSwitchPreference/res/layout/settingslib_main_switch_layout.xml
index eccf0c0..bef6e35 100644
--- a/packages/SettingsLib/MainSwitchPreference/res/layout/settingslib_main_switch_layout.xml
+++ b/packages/SettingsLib/MainSwitchPreference/res/layout/settingslib_main_switch_layout.xml
@@ -15,9 +15,10 @@
limitations under the License.
-->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="wrap_content"
- android:layout_width="match_parent" >
+ android:layout_width="match_parent"
+ android:importantForAccessibility="no">
<com.android.settingslib.widget.MainSwitchBar
android:id="@+id/settingslib_main_switch_bar"
@@ -25,6 +26,6 @@
android:layout_height="wrap_content"
android:layout_width="match_parent" />
-</LinearLayout>
+</FrameLayout>
diff --git a/packages/SettingsLib/MainSwitchPreference/res/values/dimens.xml b/packages/SettingsLib/MainSwitchPreference/res/values/dimens.xml
index a386adb..16b8af6 100644
--- a/packages/SettingsLib/MainSwitchPreference/res/values/dimens.xml
+++ b/packages/SettingsLib/MainSwitchPreference/res/values/dimens.xml
@@ -41,6 +41,9 @@
<!-- Radius of switch bar -->
<dimen name="settingslib_switch_bar_radius">28dp</dimen>
+ <!-- Size of title margin -->
+ <dimen name="settingslib_switch_title_margin">16dp</dimen>
+
<!-- SwitchBar sub settings margin start / end -->
<dimen name="settingslib_switchbar_subsettings_margin_start">72dp</dimen>
<dimen name="settingslib_switchbar_subsettings_margin_end">16dp</dimen>
diff --git a/packages/SettingsLib/SettingsTheme/res/color-night-v31/settingslib_switch_track_on.xml b/packages/SettingsLib/SettingsTheme/res/color-night-v31/settingslib_switch_track_on.xml
new file mode 100644
index 0000000..81ddf29
--- /dev/null
+++ b/packages/SettingsLib/SettingsTheme/res/color-night-v31/settingslib_switch_track_on.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2021 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:color="@android:color/system_accent2_500" android:lStar="51" />
+</selector>
\ No newline at end of file
diff --git a/packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_switch_thumb_color.xml b/packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_switch_thumb_color.xml
index df3bad4..8ccbb06 100644
--- a/packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_switch_thumb_color.xml
+++ b/packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_switch_thumb_color.xml
@@ -17,7 +17,7 @@
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Disabled status of thumb -->
<item android:state_enabled="false"
- android:color="@color/settingslib_thumb_off_color" />
+ android:color="@color/settingslib_thumb_disabled_color" />
<!-- Toggle off status of thumb -->
<item android:state_checked="false"
android:color="@color/settingslib_thumb_off_color" />
diff --git a/packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_switch_track_off.xml b/packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_switch_track_off.xml
new file mode 100644
index 0000000..762bb31
--- /dev/null
+++ b/packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_switch_track_off.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2021 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:color="@android:color/system_neutral2_500" android:lStar="45" />
+</selector>
\ No newline at end of file
diff --git a/packages/SettingsLib/SettingsTheme/res/values-night-v31/colors.xml b/packages/SettingsLib/SettingsTheme/res/values-night-v31/colors.xml
index 69975cd..8c7c7ed 100644
--- a/packages/SettingsLib/SettingsTheme/res/values-night-v31/colors.xml
+++ b/packages/SettingsLib/SettingsTheme/res/values-night-v31/colors.xml
@@ -16,11 +16,14 @@
-->
<resources>
+ <!-- Material next thumb disable color-->
+ <color name="settingslib_thumb_disabled_color">@android:color/system_neutral1_700</color>
+
<!-- Material next thumb off color-->
- <color name="settingslib_thumb_off_color">@android:color/system_neutral2_300</color>
+ <color name="settingslib_thumb_off_color">@android:color/system_neutral1_400</color>
<!-- Material next track on color-->
- <color name="settingslib_track_on_color">@android:color/system_accent2_700</color>
+ <color name="settingslib_track_on_color">@color/settingslib_switch_track_on</color>
<!-- Material next track off color-->
<color name="settingslib_track_off_color">@android:color/system_neutral1_700</color>
diff --git a/packages/SettingsLib/SettingsTheme/res/values-v31/colors.xml b/packages/SettingsLib/SettingsTheme/res/values-v31/colors.xml
index b78da90..77f1bcd 100644
--- a/packages/SettingsLib/SettingsTheme/res/values-v31/colors.xml
+++ b/packages/SettingsLib/SettingsTheme/res/values-v31/colors.xml
@@ -22,14 +22,17 @@
<!-- Material next state off color-->
<color name="settingslib_state_off_color">@android:color/system_accent2_100</color>
+ <!-- Material next thumb disable color-->
+ <color name="settingslib_thumb_disabled_color">@android:color/system_neutral2_100</color>
+
<!-- Material next thumb off color-->
- <color name="settingslib_thumb_off_color">@android:color/system_neutral2_100</color>
+ <color name="settingslib_thumb_off_color">@android:color/system_neutral2_300</color>
<!-- Material next track on color-->
<color name="settingslib_track_on_color">@android:color/system_accent1_600</color>
<!-- Material next track off color-->
- <color name="settingslib_track_off_color">@android:color/system_neutral2_600</color>
+ <color name="settingslib_track_off_color">@color/settingslib_switch_track_off</color>
<!-- Dialog accent color -->
<color name="settingslib_dialog_accent">@android:color/system_accent1_600</color>
diff --git a/packages/SettingsLib/src/com/android/settingslib/enterprise/ActionDisabledByAdminControllerFactory.java b/packages/SettingsLib/src/com/android/settingslib/enterprise/ActionDisabledByAdminControllerFactory.java
index 44cafb1..bd9e0d3 100644
--- a/packages/SettingsLib/src/com/android/settingslib/enterprise/ActionDisabledByAdminControllerFactory.java
+++ b/packages/SettingsLib/src/com/android/settingslib/enterprise/ActionDisabledByAdminControllerFactory.java
@@ -33,15 +33,17 @@
/**
* Returns the relevant instance of {@link ActionDisabledByAdminController}.
+ * @param userHandle user on which to launch the help page, if necessary
*/
public static ActionDisabledByAdminController createInstance(Context context,
- String restriction, DeviceAdminStringProvider stringProvider) {
+ String restriction, DeviceAdminStringProvider stringProvider,
+ UserHandle userHandle) {
if (doesBiometricRequireParentalConsent(context, restriction)) {
return new BiometricActionDisabledByAdminController(stringProvider);
} else if (isFinancedDevice(context)) {
return new FinancedDeviceActionDisabledByAdminController(stringProvider);
} else {
- return new ManagedDeviceActionDisabledByAdminController(stringProvider);
+ return new ManagedDeviceActionDisabledByAdminController(stringProvider, userHandle);
}
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/enterprise/ActionDisabledLearnMoreButtonLauncher.java b/packages/SettingsLib/src/com/android/settingslib/enterprise/ActionDisabledLearnMoreButtonLauncher.java
index 849c3d9..4114879 100644
--- a/packages/SettingsLib/src/com/android/settingslib/enterprise/ActionDisabledLearnMoreButtonLauncher.java
+++ b/packages/SettingsLib/src/com/android/settingslib/enterprise/ActionDisabledLearnMoreButtonLauncher.java
@@ -54,11 +54,12 @@
/**
* Sets up a "learn more" button which launches a help page
*/
- public final void setupLearnMoreButtonToLaunchHelpPage(Context context, String url) {
+ public final void setupLearnMoreButtonToLaunchHelpPage(
+ Context context, String url, UserHandle userHandle) {
requireNonNull(context, "context cannot be null");
requireNonNull(url, "url cannot be null");
- setLearnMoreButton(() -> showHelpPage(context, url));
+ setLearnMoreButton(() -> showHelpPage(context, url, userHandle));
}
/**
@@ -105,8 +106,8 @@
* Shows the help page using the given {@code url}.
*/
@VisibleForTesting
- public void showHelpPage(Context context, String url) {
- context.startActivityAsUser(createLearnMoreIntent(url), UserHandle.of(context.getUserId()));
+ public void showHelpPage(Context context, String url, UserHandle userHandle) {
+ context.startActivityAsUser(createLearnMoreIntent(url), userHandle);
finishSelf();
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/enterprise/BiometricActionDisabledByAdminController.java b/packages/SettingsLib/src/com/android/settingslib/enterprise/BiometricActionDisabledByAdminController.java
index 814d5d2..1472980 100644
--- a/packages/SettingsLib/src/com/android/settingslib/enterprise/BiometricActionDisabledByAdminController.java
+++ b/packages/SettingsLib/src/com/android/settingslib/enterprise/BiometricActionDisabledByAdminController.java
@@ -32,8 +32,10 @@
// These MUST not change, as they are the stable API between here and device admin specified
// by the component below.
- private static final String ACTION_LEARN_MORE = "android.settings.LEARN_MORE";
- private static final String EXTRA_FROM_BIOMETRIC_SETUP = "from_biometric_setup";
+ private static final String ACTION_LEARN_MORE =
+ "android.intent.action.MANAGE_RESTRICTED_SETTING";
+ private static final String EXTRA_SETTING_KEY = "extra_setting";
+ private static final String EXTRA_SETTING_VALUE = "biometric_disabled_by_admin_controller";
BiometricActionDisabledByAdminController(
DeviceAdminStringProvider stringProvider) {
@@ -63,7 +65,7 @@
Log.d(TAG, "Positive button clicked, component: " + enforcedAdmin.component);
final Intent intent = new Intent(ACTION_LEARN_MORE)
.setComponent(enforcedAdmin.component)
- .putExtra(EXTRA_FROM_BIOMETRIC_SETUP, true)
+ .putExtra(EXTRA_SETTING_KEY, EXTRA_SETTING_VALUE)
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
};
diff --git a/packages/SettingsLib/src/com/android/settingslib/enterprise/ManagedDeviceActionDisabledByAdminController.java b/packages/SettingsLib/src/com/android/settingslib/enterprise/ManagedDeviceActionDisabledByAdminController.java
index df6bab7..93e811d 100644
--- a/packages/SettingsLib/src/com/android/settingslib/enterprise/ManagedDeviceActionDisabledByAdminController.java
+++ b/packages/SettingsLib/src/com/android/settingslib/enterprise/ManagedDeviceActionDisabledByAdminController.java
@@ -16,13 +16,18 @@
package com.android.settingslib.enterprise;
+import static java.util.Objects.requireNonNull;
+
import android.app.admin.DevicePolicyManager;
import android.content.Context;
+import android.os.UserHandle;
import android.os.UserManager;
import android.text.TextUtils;
import androidx.annotation.Nullable;
+import java.util.Objects;
+
/**
* An {@link ActionDisabledByAdminController} to be used with managed devices.
@@ -30,8 +35,17 @@
final class ManagedDeviceActionDisabledByAdminController
extends BaseActionDisabledByAdminController {
- ManagedDeviceActionDisabledByAdminController(DeviceAdminStringProvider stringProvider) {
+ private final UserHandle mUserHandle;
+
+ /**
+ * Constructs a {@link ManagedDeviceActionDisabledByAdminController}
+ * @param userHandle - user on which to launch the help web page, if necessary
+ */
+ ManagedDeviceActionDisabledByAdminController(
+ DeviceAdminStringProvider stringProvider,
+ UserHandle userHandle) {
super(stringProvider);
+ mUserHandle = requireNonNull(userHandle);
}
@Override
@@ -43,7 +57,7 @@
mLauncher.setupLearnMoreButtonToShowAdminPolicies(context, mEnforcementAdminUserId,
mEnforcedAdmin);
} else {
- mLauncher.setupLearnMoreButtonToLaunchHelpPage(context, url);
+ mLauncher.setupLearnMoreButtonToLaunchHelpPage(context, url, mUserHandle);
}
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java b/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java
index 6b1e282..79446e4 100644
--- a/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java
+++ b/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java
@@ -372,7 +372,7 @@
Log.w(TAG, "shouldDisableMediaOutput() package name is null or empty!");
return false;
}
- final List<MediaRoute2Info> infos = mRouterManager.getAvailableRoutes(packageName);
+ final List<MediaRoute2Info> infos = mRouterManager.getTransferableRoutes(packageName);
if (infos.size() == 1) {
final MediaRoute2Info info = infos.get(0);
final int deviceType = info.getType();
@@ -456,7 +456,7 @@
}
private void buildAvailableRoutes() {
- for (MediaRoute2Info route : mRouterManager.getAvailableRoutes(mPackageName)) {
+ for (MediaRoute2Info route : mRouterManager.getTransferableRoutes(mPackageName)) {
if (DEBUG) {
Log.d(TAG, "buildAvailableRoutes() route : " + route.getName() + ", volume : "
+ route.getVolume() + ", type : " + route.getType());
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/enterprise/ActionDisabledByAdminControllerTestUtils.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/enterprise/ActionDisabledByAdminControllerTestUtils.java
index e57335f..636d0818 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/enterprise/ActionDisabledByAdminControllerTestUtils.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/enterprise/ActionDisabledByAdminControllerTestUtils.java
@@ -73,7 +73,7 @@
}
@Override
- public void showHelpPage(Context context, String url) {
+ public void showHelpPage(Context context, String url, UserHandle userHandle) {
mLearnMoreButtonAction = LEARN_MORE_ACTION_LAUNCH_HELP_PAGE;
}
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/enterprise/ActionDisabledLearnMoreButtonLauncherTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/enterprise/ActionDisabledLearnMoreButtonLauncherTest.java
index 62582d7..c2063c6 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/enterprise/ActionDisabledLearnMoreButtonLauncherTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/enterprise/ActionDisabledLearnMoreButtonLauncherTest.java
@@ -181,18 +181,20 @@
@Test
public void testSetupLearnMoreButtonToLaunchHelpPage_nullContext() {
assertThrows(NullPointerException.class,
- () -> mLauncher.setupLearnMoreButtonToLaunchHelpPage(/* context= */ null, URL));
+ () -> mLauncher.setupLearnMoreButtonToLaunchHelpPage(
+ /* context= */ null, URL, CONTEXT_USER));
}
@Test
public void testSetupLearnMoreButtonToLaunchHelpPage_nullUrl() {
assertThrows(NullPointerException.class,
- () -> mLauncher.setupLearnMoreButtonToLaunchHelpPage(mContext, /* url= */ null));
+ () -> mLauncher.setupLearnMoreButtonToLaunchHelpPage(
+ mContext, /* url= */ null, CONTEXT_USER));
}
@Test
public void testSetupLearnMoreButtonToLaunchHelpPage() {
- mLauncher.setupLearnMoreButtonToLaunchHelpPage(mContext, URL);
+ mLauncher.setupLearnMoreButtonToLaunchHelpPage(mContext, URL, CONTEXT_USER);
tapLearnMore();
verify(mContext).startActivityAsUser(mIntentCaptor.capture(), eq(CONTEXT_USER));
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/enterprise/ManagedDeviceActionDisabledByAdminControllerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/enterprise/ManagedDeviceActionDisabledByAdminControllerTest.java
index 19f6aa1..d9be4f3 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/enterprise/ManagedDeviceActionDisabledByAdminControllerTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/enterprise/ManagedDeviceActionDisabledByAdminControllerTest.java
@@ -116,7 +116,7 @@
private ManagedDeviceActionDisabledByAdminController createController(String url) {
ManagedDeviceActionDisabledByAdminController controller =
new ManagedDeviceActionDisabledByAdminController(
- new FakeDeviceAdminStringProvider(url));
+ new FakeDeviceAdminStringProvider(url), mContext.getUser());
controller.initialize(mTestUtils.createLearnMoreButtonLauncher());
controller.updateEnforcedAdmin(ENFORCED_ADMIN, ENFORCEMENT_ADMIN_USER_ID);
return controller;
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/IllustrationPreferenceTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/IllustrationPreferenceTest.java
index 89b0fe7..ea9be04 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/IllustrationPreferenceTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/IllustrationPreferenceTest.java
@@ -18,12 +18,25 @@
import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+
import android.content.Context;
+import android.graphics.drawable.AnimatedImageDrawable;
+import android.graphics.drawable.AnimatedVectorDrawable;
+import android.graphics.drawable.AnimationDrawable;
+import android.net.Uri;
import android.util.AttributeSet;
import android.view.View;
+import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.ImageView;
+import androidx.preference.PreferenceViewHolder;
+import androidx.test.core.app.ApplicationProvider;
+
import com.airbnb.lottie.LottieAnimationView;
import org.junit.Before;
@@ -33,47 +46,88 @@
import org.mockito.MockitoAnnotations;
import org.robolectric.Robolectric;
import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-import org.robolectric.util.ReflectionHelpers;
@RunWith(RobolectricTestRunner.class)
public class IllustrationPreferenceTest {
@Mock
- LottieAnimationView mAnimationView;
-
- private Context mContext;
+ private ViewGroup mRootView;
+ private Uri mImageUri;
+ private LottieAnimationView mAnimationView;
private IllustrationPreference mPreference;
+ private PreferenceViewHolder mViewHolder;
+ private FrameLayout mMiddleGroundLayout;
+ private final Context mContext = ApplicationProvider.getApplicationContext();
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
- mContext = RuntimeEnvironment.application;
+
+ mImageUri = new Uri.Builder().build();
+ mAnimationView = spy(new LottieAnimationView(mContext));
+ mMiddleGroundLayout = new FrameLayout(mContext);
+ final FrameLayout illustrationFrame = new FrameLayout(mContext);
+ illustrationFrame.setLayoutParams(
+ new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
+ ViewGroup.LayoutParams.WRAP_CONTENT));
+ doReturn(mMiddleGroundLayout).when(mRootView).findViewById(R.id.middleground_layout);
+ doReturn(mAnimationView).when(mRootView).findViewById(R.id.lottie_view);
+ doReturn(illustrationFrame).when(mRootView).findViewById(R.id.illustration_frame);
+ mViewHolder = spy(PreferenceViewHolder.createInstanceForTests(mRootView));
+
final AttributeSet attributeSet = Robolectric.buildAttributeSet().build();
mPreference = new IllustrationPreference(mContext, attributeSet);
- ReflectionHelpers.setField(mPreference, "mIllustrationView", mAnimationView);
}
@Test
public void setMiddleGroundView_middleGroundView_shouldVisible() {
final View view = new View(mContext);
- final FrameLayout layout = new FrameLayout(mContext);
- layout.setVisibility(View.GONE);
- ReflectionHelpers.setField(mPreference, "mMiddleGroundView", view);
- ReflectionHelpers.setField(mPreference, "mMiddleGroundLayout", layout);
+ mMiddleGroundLayout.setVisibility(View.GONE);
mPreference.setMiddleGroundView(view);
+ mPreference.onBindViewHolder(mViewHolder);
- assertThat(layout.getVisibility()).isEqualTo(View.VISIBLE);
+ assertThat(mMiddleGroundLayout.getVisibility()).isEqualTo(View.VISIBLE);
}
@Test
public void enableAnimationAutoScale_shouldChangeScaleType() {
- final LottieAnimationView animationView = new LottieAnimationView(mContext);
- ReflectionHelpers.setField(mPreference, "mIllustrationView", animationView);
-
mPreference.enableAnimationAutoScale(true);
+ mPreference.onBindViewHolder(mViewHolder);
- assertThat(animationView.getScaleType()).isEqualTo(ImageView.ScaleType.CENTER_CROP);
+ assertThat(mAnimationView.getScaleType()).isEqualTo(ImageView.ScaleType.CENTER_CROP);
+ }
+
+ @Test
+ public void playAnimationWithUri_animatedImageDrawable_success() {
+ final AnimatedImageDrawable drawable = mock(AnimatedImageDrawable.class);
+ doReturn(drawable).when(mAnimationView).getDrawable();
+
+ mPreference.setImageUri(mImageUri);
+ mPreference.onBindViewHolder(mViewHolder);
+
+ verify(drawable).start();
+ }
+
+ @Test
+ public void playAnimationWithUri_animatedVectorDrawable_success() {
+ final AnimatedVectorDrawable drawable = mock(AnimatedVectorDrawable.class);
+ doReturn(drawable).when(mAnimationView).getDrawable();
+
+ mPreference.setImageUri(mImageUri);
+ mPreference.onBindViewHolder(mViewHolder);
+
+ verify(drawable).start();
+ }
+
+ @Test
+ public void playAnimationWithUri_animationDrawable_success() {
+ final AnimationDrawable drawable = mock(AnimationDrawable.class);
+ doReturn(drawable).when(mAnimationView).getDrawable();
+
+ mPreference.setImageUri(mImageUri);
+ mPreference.onBindViewHolder(mViewHolder);
+
+ verify(drawable).start();
}
}
diff --git a/packages/Shell/AndroidManifest.xml b/packages/Shell/AndroidManifest.xml
index 491f0d9..bc1d420 100644
--- a/packages/Shell/AndroidManifest.xml
+++ b/packages/Shell/AndroidManifest.xml
@@ -104,7 +104,6 @@
<uses-permission android:name="android.permission.PERSISTENT_ACTIVITY" />
<uses-permission android:name="android.permission.GET_PACKAGE_SIZE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
- <uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM" />
<uses-permission android:name="android.permission.REQUEST_DELETE_PACKAGES" />
<uses-permission android:name="android.permission.REQUEST_OBSERVE_COMPANION_DEVICE_PRESENCE" />
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
@@ -568,6 +567,9 @@
<!-- Permission required for CTS test - GlobalSearchSessionPlatformCtsTests -->
<uses-permission android:name="android.permission.READ_GLOBAL_APP_SEARCH_DATA" />
+ <!-- Permission required for GTS test - PendingSystemUpdateTest -->
+ <uses-permission android:name="android.permission.NOTIFY_PENDING_SYSTEM_UPDATE" />
+
<application android:label="@string/app_label"
android:theme="@android:style/Theme.DeviceDefault.DayNight"
android:defaultToDeviceProtectedStorage="true"
diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml
index 604310a..8963dda 100644
--- a/packages/SystemUI/AndroidManifest.xml
+++ b/packages/SystemUI/AndroidManifest.xml
@@ -281,6 +281,8 @@
<!-- Permission for Smartspace. -->
<uses-permission android:name="android.permission.MANAGE_SMARTSPACE" />
+ <uses-permission android:name="android.permission.READ_PEOPLE_DATA" />
+
<protected-broadcast android:name="com.android.settingslib.action.REGISTER_SLICE_RECEIVER" />
<protected-broadcast android:name="com.android.settingslib.action.UNREGISTER_SLICE_RECEIVER" />
<protected-broadcast android:name="com.android.settings.flashlight.action.FLASHLIGHT_CHANGED" />
@@ -604,7 +606,8 @@
</activity>
<activity android:name=".people.widget.LaunchConversationActivity"
- android:windowDisablePreview="true" />
+ android:windowDisablePreview="true"
+ android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen" />
<!-- People Space Widget -->
<receiver
@@ -630,6 +633,9 @@
android:permission="android.permission.GET_PEOPLE_TILE_PREVIEW">
</provider>
+ <service android:name=".people.PeopleBackupFollowUpJob"
+ android:permission="android.permission.BIND_JOB_SERVICE"/>
+
<!-- a gallery of delicious treats -->
<service
android:name=".DessertCaseDream"
diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QS.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QS.java
index 98ef9e2..de2eca2 100644
--- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QS.java
+++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QS.java
@@ -23,6 +23,8 @@
import com.android.systemui.plugins.annotations.ProvidesInterface;
import com.android.systemui.plugins.qs.QS.HeightListener;
+import java.util.function.Consumer;
+
/**
* Fragment that contains QS in the notification shade. Most of the interface is for
* handling the expand/collapsing of the view interaction.
@@ -33,7 +35,7 @@
String ACTION = "com.android.systemui.action.PLUGIN_QS";
- int VERSION = 9;
+ int VERSION = 10;
String TAG = "QS";
@@ -101,6 +103,11 @@
return true;
}
+ /**
+ * Add a listener for when the collapsed media visibility changes.
+ */
+ void setCollapsedMediaVisibilityChangedListener(Consumer<Boolean> listener);
+
@ProvidesInterface(version = HeightListener.VERSION)
interface HeightListener {
int VERSION = 1;
diff --git a/packages/SystemUI/res-keyguard/values-ta/strings.xml b/packages/SystemUI/res-keyguard/values-ta/strings.xml
index e5031c82..937ad06 100644
--- a/packages/SystemUI/res-keyguard/values-ta/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ta/strings.xml
@@ -26,7 +26,7 @@
<string name="keyguard_password_enter_puk_prompt" msgid="3529260761374385243">"சிம் PUK குறியீடு"</string>
<string name="keyguard_password_enter_pin_prompt" msgid="2304037870481240781">"புதிய சிம் பின் குறியீடு"</string>
<string name="keyguard_password_entry_touch_hint" msgid="6180028658339706333"><font size="17">"கடவுச்சொல்லை உள்ளிட, தொடவும்"</font></string>
- <string name="keyguard_password_enter_password_code" msgid="7393393239623946777">"திறக்க, கடவுச்சொல்லை உள்ளிடவும்"</string>
+ <string name="keyguard_password_enter_password_code" msgid="7393393239623946777">"அன்லாக் செய்ய கடவுச்சொல்லை உள்ளிடவும்"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="3692259677395250509">"திறக்க, பின்னை உள்ளிடவும்"</string>
<string name="keyguard_enter_your_pin" msgid="5429932527814874032">"பின்னை உள்ளிடுக"</string>
<string name="keyguard_enter_your_pattern" msgid="351503370332324745">"பேட்டர்னை உள்ளிடுக"</string>
@@ -40,7 +40,7 @@
<string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> • மெதுவாகச் சார்ஜாகிறது"</string>
<string name="keyguard_plugged_in_charging_limited" msgid="6091488837901216962">"<xliff:g id="PERCENTAGE">%s</xliff:g> • சார்ஜாவது தற்காலிகமாக வரம்பிடப்பட்டுள்ளது"</string>
<string name="keyguard_low_battery" msgid="1868012396800230904">"சார்ஜரை இணைக்கவும்."</string>
- <string name="keyguard_instructions_when_pattern_disabled" msgid="8448804180089936954">"திறக்க, மெனுவை அழுத்தவும்."</string>
+ <string name="keyguard_instructions_when_pattern_disabled" msgid="8448804180089936954">"அன்லாக் செய்ய மெனுவை அழுத்தவும்."</string>
<string name="keyguard_network_locked_message" msgid="407096292844868608">"நெட்வொர்க் பூட்டப்பட்டது"</string>
<string name="keyguard_missing_sim_message_short" msgid="704159478161444907">"சிம் கார்டு இல்லை"</string>
<string name="keyguard_missing_sim_instructions" msgid="1162120926141335918">"சிம் கார்டைச் செருகவும்."</string>
@@ -85,11 +85,11 @@
<string name="kg_login_too_many_attempts" msgid="4519957179182578690">"பேட்டர்னை அதிக முறை தவறாக வரைந்துவிட்டீர்கள்"</string>
<string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="544687656831558971">"உங்கள் பின்னை <xliff:g id="NUMBER_0">%1$d</xliff:g> முறை தவறாக உள்ளிட்டுவிட்டீர்கள். \n\n<xliff:g id="NUMBER_1">%2$d</xliff:g> வினாடிகளில் மீண்டும் முயலவும்."</string>
<string name="kg_too_many_failed_password_attempts_dialog_message" msgid="190984061975729494">"உங்கள் கடவுச்சொல்லை <xliff:g id="NUMBER_0">%1$d</xliff:g> முறை தவறாக உள்ளிட்டுவிட்டீர்கள். \n\n<xliff:g id="NUMBER_1">%2$d</xliff:g> வினாடிகளில் மீண்டும் முயலவும்."</string>
- <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="4252405904570284368">"திறப்பதற்கான பேட்டர்னை, <xliff:g id="NUMBER_0">%1$d</xliff:g> முறை தவறாக வரைந்துவிட்டீர்கள். \n\n<xliff:g id="NUMBER_1">%2$d</xliff:g> வினாடிகளில் மீண்டும் முயலவும்."</string>
- <string name="kg_password_wrong_pin_code_pukked" msgid="8047350661459040581">"சிம்மின் பின் குறியீடு தவறானது. இனி சாதனத்தைத் திறக்க, உங்கள் தொலைத்தொடர்பு நிறுவனத்தைத் தொடர்புகொள்ள வேண்டும்."</string>
+ <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="4252405904570284368">"அன்லாக் பேட்டர்னை, <xliff:g id="NUMBER_0">%1$d</xliff:g> முறை தவறாக வரைந்துவிட்டீர்கள். \n\n<xliff:g id="NUMBER_1">%2$d</xliff:g> வினாடிகளில் மீண்டும் முயலவும்."</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="8047350661459040581">"சிம்மின் பின் குறியீடு தவறானது. இனி சாதனத்தை அன்லாக் செய்ய, உங்கள் தொலைத்தொடர்பு நிறுவனத்தைத் தொடர்புகொள்ள வேண்டும்."</string>
<plurals name="kg_password_wrong_pin_code" formatted="false" msgid="7030584350995485026">
<item quantity="other">சிம்மின் பின் குறியீடு தவறானது, இன்னும் நீங்கள் <xliff:g id="NUMBER_1">%d</xliff:g> முறை முயலலாம்.</item>
- <item quantity="one">சிம்மின் பின் குறியீடு தவறானது, மேலும் <xliff:g id="NUMBER_0">%d</xliff:g> முயற்சிகளுக்குப் பின்னர், உங்கள் தொலைத்தொடர்பு நிறுவனத்தைத் தொடர்பு கொண்டு மட்டுமே சாதனத்தைத் திறக்க முடியும்.</item>
+ <item quantity="one">சிம்மின் பின் குறியீடு தவறானது, மேலும் <xliff:g id="NUMBER_0">%d</xliff:g> முயற்சிகளுக்குப் பின்னர், உங்கள் தொலைத்தொடர்பு நிறுவனத்தைத் தொடர்பு கொண்டு மட்டுமே சாதனத்தை அன்லாக் செய்ய முடியும்.</item>
</plurals>
<string name="kg_password_wrong_puk_code_dead" msgid="3698285357028468617">"பயன்படுத்த முடியாத சிம். உங்கள் தொலைத்தொடர்பு நிறுவனத்தைத் தொடர்புகொள்ளவும்."</string>
<plurals name="kg_password_wrong_puk_code" formatted="false" msgid="3937306685604862886">
@@ -129,7 +129,7 @@
<string name="kg_face_not_recognized" msgid="7903950626744419160">"அடையாளங்காணபடவில்லை"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
<item quantity="other">சிம் பின்னை உள்ளிடவும். மேலும், <xliff:g id="NUMBER_1">%d</xliff:g> வாய்ப்புகள் மீதமுள்ளன.</item>
- <item quantity="one">சிம் பின்னை உள்ளிடவும். மீதமுள்ள <xliff:g id="NUMBER_0">%d</xliff:g> வாய்ப்பில் தவறுதலான பின் உள்ளிடப்பட்டால், உங்கள் தொலைத்தொடர்பு நிறுவனத்தைத் தொடர்பு கொண்டு மட்டுமே சாதனத்தைத் திறக்க முடியும்.</item>
+ <item quantity="one">சிம் பின்னை உள்ளிடவும். மீதமுள்ள <xliff:g id="NUMBER_0">%d</xliff:g> வாய்ப்பில் தவறுதலான பின் உள்ளிடப்பட்டால், உங்கள் தொலைத்தொடர்பு நிறுவனத்தைத் தொடர்பு கொண்டு மட்டுமே சாதனத்தை அன்லாக் செய்ய முடியும்.</item>
</plurals>
<plurals name="kg_password_default_puk_message" formatted="false" msgid="571308542462946935">
<item quantity="other">சிம் தற்போது முடக்கப்பட்டுள்ளது. தொடர்வதற்கு, PUK குறியீட்டை உள்ளிடவும். நீங்கள் <xliff:g id="_NUMBER_1">%d</xliff:g> முறை மட்டுமே முயற்சிக்க முடியும். அதன்பிறகு சிம் நிரந்தரமாக முடக்கப்படும். விவரங்களுக்கு, மொபைல் நிறுவனத்தைத் தொடர்புகொள்ளவும்.</item>
diff --git a/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml b/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml
index ec0500f..34c8926 100644
--- a/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml
@@ -36,7 +36,7 @@
<string name="keyguard_charged" msgid="5478247181205188995">"已完成充電"</string>
<string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • 無線充電中"</string>
<string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • 正在充電"</string>
- <string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • 正在快速充電"</string>
+ <string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • 快速充電中"</string>
<string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> •正在慢速充電"</string>
<string name="keyguard_plugged_in_charging_limited" msgid="6091488837901216962">"<xliff:g id="PERCENTAGE">%s</xliff:g> • 充電暫時受限"</string>
<string name="keyguard_low_battery" msgid="1868012396800230904">"請連接充電器。"</string>
diff --git a/packages/SystemUI/res/color/screenrecord_switch_thumb_color.xml b/packages/SystemUI/res/color/screenrecord_switch_thumb_color.xml
new file mode 100644
index 0000000..22b7a1e
--- /dev/null
+++ b/packages/SystemUI/res/color/screenrecord_switch_thumb_color.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2021 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <!-- Disabled status of thumb -->
+ <item android:state_enabled="false"
+ android:color="@android:color/system_neutral2_100" />
+ <!-- Toggle off status of thumb -->
+ <item android:state_checked="false"
+ android:color="@android:color/system_neutral2_100" />
+ <!-- Enabled or toggle on status of thumb -->
+ <item android:color="@android:color/system_accent1_100" />
+</selector>
\ No newline at end of file
diff --git a/packages/SystemUI/res/color/screenrecord_switch_track_color.xml b/packages/SystemUI/res/color/screenrecord_switch_track_color.xml
new file mode 100644
index 0000000..bb55b07
--- /dev/null
+++ b/packages/SystemUI/res/color/screenrecord_switch_track_color.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2021 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <!-- Disabled status of thumb -->
+ <item android:state_enabled="false"
+ android:color="@android:color/system_neutral2_600"
+ android:alpha="?android:attr/disabledAlpha" />
+ <!-- Toggle off status of thumb -->
+ <item android:state_checked="false"
+ android:color="@android:color/system_neutral2_600" />
+ <!-- Enabled or toggle on status of thumb -->
+ <item android:color="@android:color/system_accent1_600" />
+</selector>
\ No newline at end of file
diff --git a/packages/SystemUI/res/drawable/ic_touch.xml b/packages/SystemUI/res/drawable/ic_touch.xml
index 4f6698d..18ad367 100644
--- a/packages/SystemUI/res/drawable/ic_touch.xml
+++ b/packages/SystemUI/res/drawable/ic_touch.xml
@@ -13,14 +13,13 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
-<!-- maybe need android:fillType="evenOdd" -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="24dp"
- android:height="24dp"
- android:viewportWidth="24.0"
- android:viewportHeight="24.0">
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24"
+ android:viewportHeight="24"
+ android:tint="?attr/colorControlNormal">
<path
- android:fillColor="#FF000000"
- android:pathData="M9,7.5V11.24C7.79,10.43 7,9.06 7,7.5C7,5.01 9.01,3 11.5,3C13.99,3 16,5.01 16,7.5C16,9.06 15.21,10.43 14,11.24V7.5C14,6.12 12.88,5 11.5,5C10.12,5 9,6.12 9,7.5ZM14.3,13.61L18.84,15.87C19.37,16.09 19.75,16.63 19.75,17.25C19.75,17.31 19.74,17.38 19.73,17.45L18.98,22.72C18.87,23.45 18.29,24 17.54,24H10.75C10.34,24 9.96,23.83 9.69,23.56L4.75,18.62L5.54,17.82C5.74,17.62 6.02,17.49 6.33,17.49C6.39,17.49 6.4411,17.4989 6.4922,17.5078C6.5178,17.5122 6.5433,17.5167 6.57,17.52L10,18.24V7.5C10,6.67 10.67,6 11.5,6C12.33,6 13,6.67 13,7.5V13.5H13.76C13.95,13.5 14.13,13.54 14.3,13.61Z"
- />
+ android:fillColor="@android:color/white"
+ android:pathData="M18.19,12.44l-3.24,-1.62c1.29,-1 2.12,-2.56 2.12,-4.32c0,-3.03 -2.47,-5.5 -5.5,-5.5s-5.5,2.47 -5.5,5.5c0,2.13 1.22,3.98 3,4.89v3.26c-2.11,-0.45 -2.01,-0.44 -2.26,-0.44c-0.53,0 -1.03,0.21 -1.41,0.59L4,16.22l5.09,5.09C9.52,21.75 10.12,22 10.74,22h6.3c0.98,0 1.81,-0.7 1.97,-1.67l0.8,-4.71C20.03,14.32 19.38,13.04 18.19,12.44zM17.84,15.29L17.04,20h-6.3c-0.09,0 -0.17,-0.04 -0.24,-0.1l-3.68,-3.68l4.25,0.89V6.5c0,-0.28 0.22,-0.5 0.5,-0.5c0.28,0 0.5,0.22 0.5,0.5v6h1.76l3.46,1.73C17.69,14.43 17.91,14.86 17.84,15.29zM8.07,6.5c0,-1.93 1.57,-3.5 3.5,-3.5s3.5,1.57 3.5,3.5c0,0.95 -0.38,1.81 -1,2.44V6.5c0,-1.38 -1.12,-2.5 -2.5,-2.5c-1.38,0 -2.5,1.12 -2.5,2.5v2.44C8.45,8.31 8.07,7.45 8.07,6.5z"/>
</vector>
diff --git a/packages/SystemUI/res/drawable/screenrecord_button_background_outline.xml b/packages/SystemUI/res/drawable/screenrecord_button_background_outline.xml
new file mode 100644
index 0000000..59a31e8
--- /dev/null
+++ b/packages/SystemUI/res/drawable/screenrecord_button_background_outline.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2021 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
+ android:shape="rectangle">
+ <stroke
+ android:color="?androidprv:attr/colorAccentPrimary"
+ android:width="1dp"/>
+ <corners android:radius="24dp"/>
+ <padding
+ android:left="16dp"
+ android:right="16dp"
+ android:top="8dp"
+ android:bottom="8dp" />
+ <solid android:color="@android:color/transparent" />
+</shape>
diff --git a/core/tests/coretests/apks/res_upgrade/res_after/values/values.xml b/packages/SystemUI/res/drawable/screenrecord_button_background_solid.xml
similarity index 61%
copy from core/tests/coretests/apks/res_upgrade/res_after/values/values.xml
copy to packages/SystemUI/res/drawable/screenrecord_button_background_solid.xml
index db4fd54..d6446fc 100644
--- a/core/tests/coretests/apks/res_upgrade/res_after/values/values.xml
+++ b/packages/SystemUI/res/drawable/screenrecord_button_background_solid.xml
@@ -1,5 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
-
<!--
~ Copyright (C) 2021 The Android Open Source Project
~
@@ -15,8 +14,14 @@
~ See the License for the specific language governing permissions and
~ limitations under the License.
-->
-
-<resources>
- <string name="version">after</string>
- <public type="string" name="version" id="0x7f010000"/>
-</resources>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
+ android:shape="rectangle">
+ <corners android:radius="24dp"/>
+ <padding
+ android:left="16dp"
+ android:right="16dp"
+ android:top="8dp"
+ android:bottom="8dp" />
+ <solid android:color="?androidprv:attr/colorAccentPrimary" />
+</shape>
\ No newline at end of file
diff --git a/core/tests/coretests/apks/res_upgrade/res_after/values/values.xml b/packages/SystemUI/res/drawable/screenrecord_spinner_background.xml
similarity index 67%
copy from core/tests/coretests/apks/res_upgrade/res_after/values/values.xml
copy to packages/SystemUI/res/drawable/screenrecord_spinner_background.xml
index db4fd54..e82fb8f 100644
--- a/core/tests/coretests/apks/res_upgrade/res_after/values/values.xml
+++ b/packages/SystemUI/res/drawable/screenrecord_spinner_background.xml
@@ -1,5 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
-
<!--
~ Copyright (C) 2021 The Android Open Source Project
~
@@ -15,8 +14,10 @@
~ See the License for the specific language governing permissions and
~ limitations under the License.
-->
-
-<resources>
- <string name="version">after</string>
- <public type="string" name="version" id="0x7f010000"/>
-</resources>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
+ android:shape="rectangle"
+ android:padding="12dp">
+ <corners android:radius="24dp"/>
+ <solid android:color="?androidprv:attr/colorAccentSecondary" />
+</shape>
\ No newline at end of file
diff --git a/core/tests/coretests/apks/res_upgrade/res_after/values/values.xml b/packages/SystemUI/res/drawable/screenrecord_switch_thumb.xml
similarity index 61%
copy from core/tests/coretests/apks/res_upgrade/res_after/values/values.xml
copy to packages/SystemUI/res/drawable/screenrecord_switch_thumb.xml
index db4fd54..f78c582 100644
--- a/core/tests/coretests/apks/res_upgrade/res_after/values/values.xml
+++ b/packages/SystemUI/res/drawable/screenrecord_switch_thumb.xml
@@ -1,5 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
-
<!--
~ Copyright (C) 2021 The Android Open Source Project
~
@@ -16,7 +15,15 @@
~ limitations under the License.
-->
-<resources>
- <string name="version">after</string>
- <public type="string" name="version" id="0x7f010000"/>
-</resources>
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+ <item
+ android:top="4dp"
+ android:left="4dp"
+ android:right="4dp"
+ android:bottom="4dp">
+ <shape android:shape="oval" >
+ <size android:height="20dp" android:width="20dp" />
+ <solid android:color="@color/screenrecord_switch_thumb_color" />
+ </shape>
+ </item>
+</layer-list>
\ No newline at end of file
diff --git a/core/tests/coretests/apks/res_upgrade/res_after/values/values.xml b/packages/SystemUI/res/drawable/screenrecord_switch_track.xml
similarity index 71%
rename from core/tests/coretests/apks/res_upgrade/res_after/values/values.xml
rename to packages/SystemUI/res/drawable/screenrecord_switch_track.xml
index db4fd54..82595e4 100644
--- a/core/tests/coretests/apks/res_upgrade/res_after/values/values.xml
+++ b/packages/SystemUI/res/drawable/screenrecord_switch_track.xml
@@ -1,5 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
-
<!--
~ Copyright (C) 2021 The Android Open Source Project
~
@@ -15,8 +14,11 @@
~ See the License for the specific language governing permissions and
~ limitations under the License.
-->
-
-<resources>
- <string name="version">after</string>
- <public type="string" name="version" id="0x7f010000"/>
-</resources>
+<shape
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:shape="rectangle"
+ android:width="52dp"
+ android:height="28dp">
+ <solid android:color="@color/screenrecord_switch_track_color" />
+ <corners android:radius="35dp" />
+</shape>
\ No newline at end of file
diff --git a/packages/SystemUI/res/layout/long_screenshot.xml b/packages/SystemUI/res/layout/long_screenshot.xml
index 8dfe79e..8a2c8f0 100644
--- a/packages/SystemUI/res/layout/long_screenshot.xml
+++ b/packages/SystemUI/res/layout/long_screenshot.xml
@@ -113,8 +113,9 @@
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:handleThickness="@dimen/screenshot_crop_handle_thickness"
- app:handleColor="?androidprv:attr/colorAccentPrimary"
- app:scrimColor="@color/screenshot_crop_scrim"
+ app:handleColor="?android:attr/colorAccent"
+ app:scrimColor="?android:colorBackgroundFloating"
+ app:scrimAlpha="128"
app:containerBackgroundColor="?android:colorBackgroundFloating"
tools:background="?android:colorBackground"
tools:minHeight="100dp"
@@ -129,8 +130,9 @@
app:layout_constraintTop_toTopOf="@id/preview"
app:layout_constraintLeft_toLeftOf="parent"
app:handleThickness="@dimen/screenshot_crop_handle_thickness"
- app:handleColor="?androidprv:attr/colorAccentSecondary"
- app:scrimColor="@color/screenshot_crop_scrim"
+ app:handleColor="?android:attr/colorAccent"
+ app:scrimColor="?android:colorBackgroundFloating"
+ app:scrimAlpha="128"
app:borderThickness="4dp"
app:borderColor="#fff"
/>
diff --git a/packages/SystemUI/res/layout/screen_record_dialog.xml b/packages/SystemUI/res/layout/screen_record_dialog.xml
index c1767ee..d1cc01f 100644
--- a/packages/SystemUI/res/layout/screen_record_dialog.xml
+++ b/packages/SystemUI/res/layout/screen_record_dialog.xml
@@ -28,6 +28,10 @@
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
+ android:paddingStart="24dp"
+ android:paddingEnd="24dp"
+ android:paddingTop="26dp"
+ android:paddingBottom="30dp"
android:orientation="vertical">
<!-- Header -->
@@ -35,27 +39,28 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
- android:gravity="center"
- android:padding="@dimen/screenrecord_dialog_padding">
+ android:gravity="center">
<ImageView
android:layout_width="@dimen/screenrecord_logo_size"
android:layout_height="@dimen/screenrecord_logo_size"
android:src="@drawable/ic_screenrecord"
- android:tint="@color/GM2_red_500"
- android:layout_marginBottom="@dimen/screenrecord_dialog_padding"/>
+ android:tint="@color/screenrecord_icon_color"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:fontFamily="@*android:string/config_headlineFontFamily"
- android:text="@string/screenrecord_start_label"/>
+ android:text="@string/screenrecord_start_label"
+ android:layout_marginTop="22dp"
+ android:layout_marginBottom="15dp"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/screenrecord_description"
android:textAppearance="?android:attr/textAppearanceSmall"
- android:paddingTop="@dimen/screenrecord_dialog_padding"
- android:paddingBottom="@dimen/screenrecord_dialog_padding"/>
+ android:textColor="?android:textColorSecondary"
+ android:gravity="center"
+ android:layout_marginBottom="20dp"/>
<!-- Options -->
<LinearLayout
@@ -63,18 +68,21 @@
android:layout_height="wrap_content"
android:orientation="horizontal">
<ImageView
- android:layout_width="@dimen/screenrecord_logo_size"
- android:layout_height="@dimen/screenrecord_logo_size"
+ android:layout_width="@dimen/screenrecord_option_icon_size"
+ android:layout_height="@dimen/screenrecord_option_icon_size"
android:src="@drawable/ic_mic_26dp"
- android:tint="@color/GM2_grey_700"
+ android:tint="?android:attr/textColorSecondary"
android:layout_gravity="center"
android:layout_weight="0"
- android:layout_marginRight="@dimen/screenrecord_dialog_padding"/>
+ android:layout_marginRight="@dimen/screenrecord_option_padding"/>
<Spinner
android:id="@+id/screen_recording_options"
android:layout_width="0dp"
- android:layout_height="48dp"
+ android:layout_height="wrap_content"
+ android:minHeight="48dp"
android:layout_weight="1"
+ android:popupBackground="@drawable/screenrecord_spinner_background"
+ android:dropDownWidth="274dp"
android:prompt="@string/screenrecord_audio_label"/>
<Switch
android:layout_width="wrap_content"
@@ -83,63 +91,76 @@
android:layout_weight="0"
android:layout_gravity="end"
android:contentDescription="@string/screenrecord_audio_label"
- android:id="@+id/screenrecord_audio_switch"/>
+ android:id="@+id/screenrecord_audio_switch"
+ style="@style/ScreenRecord.Switch"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:orientation="horizontal">
+ android:orientation="horizontal"
+ android:layout_marginTop="@dimen/screenrecord_option_padding">
<ImageView
- android:layout_width="@dimen/screenrecord_logo_size"
- android:layout_height="@dimen/screenrecord_logo_size"
+ android:layout_width="@dimen/screenrecord_option_icon_size"
+ android:layout_height="@dimen/screenrecord_option_icon_size"
+ android:layout_weight="0"
android:src="@drawable/ic_touch"
- android:tint="@color/GM2_grey_700"
+ android:tint="?android:attr/textColorSecondary"
android:layout_gravity="center"
- android:layout_marginRight="@dimen/screenrecord_dialog_padding"/>
- <Switch
- android:layout_width="match_parent"
- android:layout_height="48dp"
- android:id="@+id/screenrecord_taps_switch"
+ android:layout_marginRight="@dimen/screenrecord_option_padding"/>
+ <TextView
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:minHeight="48dp"
+ android:layout_weight="1"
android:text="@string/screenrecord_taps_label"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:fontFamily="@*android:string/config_headlineFontFamily"
android:textColor="?android:attr/textColorPrimary"
- android:textAppearance="?android:attr/textAppearanceSmall"/>
-
+ android:importantForAccessibility="no"/>
+ <Switch
+ android:layout_width="wrap_content"
+ android:minWidth="48dp"
+ android:layout_height="48dp"
+ android:layout_weight="0"
+ android:id="@+id/screenrecord_taps_switch"
+ android:contentDescription="@string/screenrecord_taps_label"
+ style="@style/ScreenRecord.Switch"/>
</LinearLayout>
</LinearLayout>
- <!-- hr -->
- <View
- android:layout_width="match_parent"
- android:layout_height="1dp"
- android:background="@color/GM2_grey_300"/>
-
<!-- Buttons -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
- android:padding="@dimen/screenrecord_dialog_padding">
- <Button
+ android:layout_marginTop="36dp">
+ <TextView
android:id="@+id/button_cancel"
android:layout_width="wrap_content"
- android:layout_height="match_parent"
+ android:layout_height="wrap_content"
android:layout_weight="0"
android:layout_gravity="start"
android:text="@string/cancel"
- style="@android:style/Widget.DeviceDefault.Button.Borderless.Colored"/>
+ android:textColor="?android:textColorPrimary"
+ android:background="@drawable/screenrecord_button_background_outline"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:textSize="14sp"/>
<Space
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"/>
- <Button
+ <TextView
android:id="@+id/button_start"
android:layout_width="wrap_content"
- android:layout_height="match_parent"
+ android:layout_height="wrap_content"
android:layout_weight="0"
android:layout_gravity="end"
android:text="@string/screenrecord_start"
- style="@android:style/Widget.DeviceDefault.Button.Colored"/>
+ android:textColor="@android:color/system_neutral1_900"
+ android:background="@drawable/screenrecord_button_background_solid"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:textSize="14sp"/>
</LinearLayout>
</LinearLayout>
</ScrollView>
diff --git a/packages/SystemUI/res/layout/screen_record_dialog_audio_source.xml b/packages/SystemUI/res/layout/screen_record_dialog_audio_source.xml
index 0c4d5a2..ab600b3 100644
--- a/packages/SystemUI/res/layout/screen_record_dialog_audio_source.xml
+++ b/packages/SystemUI/res/layout/screen_record_dialog_audio_source.xml
@@ -19,18 +19,19 @@
android:layout_width="250dp"
android:layout_height="48dp"
android:orientation="vertical"
- android:padding="13dp">
+ android:padding="12dp">
<TextView
android:id="@+id/screen_recording_dialog_source_text"
- android:layout_width="250dp"
+ android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center_vertical"
- android:textAppearance="?android:attr/textAppearanceSmall"
- android:textColor="?android:attr/textColorPrimary"/>
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:textSize="14sp"
+ android:textColor="@android:color/system_neutral1_900"/>
<TextView
android:id="@+id/screen_recording_dialog_source_description"
- android:layout_width="250dp"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceSmall"
- android:textColor="?android:attr/textColorSecondary"/>
+ android:textColor="@android:color/system_neutral2_700"/>
</LinearLayout>
\ No newline at end of file
diff --git a/packages/SystemUI/res/layout/screen_record_dialog_audio_source_selected.xml b/packages/SystemUI/res/layout/screen_record_dialog_audio_source_selected.xml
index fabe9e2..e2b8d33 100644
--- a/packages/SystemUI/res/layout/screen_record_dialog_audio_source_selected.xml
+++ b/packages/SystemUI/res/layout/screen_record_dialog_audio_source_selected.xml
@@ -24,7 +24,8 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="@string/screenrecord_audio_label"
- android:textAppearance="?android:attr/textAppearanceSmall"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:fontFamily="@*android:string/config_headlineFontFamily"
android:textColor="?android:attr/textColorPrimary"/>
<TextView
android:id="@+id/screen_recording_dialog_source_text"
diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml
index 568398c..8c02a0f 100644
--- a/packages/SystemUI/res/values-bn/strings.xml
+++ b/packages/SystemUI/res/values-bn/strings.xml
@@ -1145,8 +1145,7 @@
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"সাম্প্রতিক মেসেজ, মিসড কল এবং স্ট্যাটাস সংক্রান্ত আপডেট দেখুন"</string>
<string name="people_tile_title" msgid="6589377493334871272">"কথোপকথন"</string>
- <!-- no translation found for paused_by_dnd (7856941866433556428) -->
- <skip />
+ <string name="paused_by_dnd" msgid="7856941866433556428">"\'বিরক্ত করবে না\' মোডের মাধ্যমে পজ করা আছে"</string>
<string name="new_notification_text_content_description" msgid="5574393603145263727">"<xliff:g id="NAME">%1$s</xliff:g> একটি মেসেজ পাঠিয়েছেন"</string>
<string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> একটি ছবি পাঠিয়েছেন"</string>
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"ব্যাটারির মিটারের রিডিং নেওয়ার সময় সমস্যা হয়েছে"</string>
diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml
index 8403d40..f401fd4 100644
--- a/packages/SystemUI/res/values-en-rAU/strings.xml
+++ b/packages/SystemUI/res/values-en-rAU/strings.xml
@@ -1115,8 +1115,7 @@
<string name="basic_status" msgid="2315371112182658176">"Open conversation"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Conversation widgets"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Tap a conversation to add it to your home screen"</string>
- <!-- no translation found for no_conversations_text (5354115541282395015) -->
- <skip />
+ <string name="no_conversations_text" msgid="5354115541282395015">"Your recent conversations will show up here"</string>
<string name="priority_conversations" msgid="3967482288896653039">"Priority conversations"</string>
<string name="recent_conversations" msgid="8531874684782574622">"Recent conversations"</string>
<string name="okay" msgid="6490552955618608554">"OK"</string>
diff --git a/packages/SystemUI/res/values-en-rCA/strings.xml b/packages/SystemUI/res/values-en-rCA/strings.xml
index c104c2c..cef55f7 100644
--- a/packages/SystemUI/res/values-en-rCA/strings.xml
+++ b/packages/SystemUI/res/values-en-rCA/strings.xml
@@ -1115,8 +1115,7 @@
<string name="basic_status" msgid="2315371112182658176">"Open conversation"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Conversation widgets"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Tap a conversation to add it to your home screen"</string>
- <!-- no translation found for no_conversations_text (5354115541282395015) -->
- <skip />
+ <string name="no_conversations_text" msgid="5354115541282395015">"Your recent conversations will show up here"</string>
<string name="priority_conversations" msgid="3967482288896653039">"Priority conversations"</string>
<string name="recent_conversations" msgid="8531874684782574622">"Recent conversations"</string>
<string name="okay" msgid="6490552955618608554">"OK"</string>
diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml
index 8403d40..f401fd4 100644
--- a/packages/SystemUI/res/values-en-rGB/strings.xml
+++ b/packages/SystemUI/res/values-en-rGB/strings.xml
@@ -1115,8 +1115,7 @@
<string name="basic_status" msgid="2315371112182658176">"Open conversation"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Conversation widgets"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Tap a conversation to add it to your home screen"</string>
- <!-- no translation found for no_conversations_text (5354115541282395015) -->
- <skip />
+ <string name="no_conversations_text" msgid="5354115541282395015">"Your recent conversations will show up here"</string>
<string name="priority_conversations" msgid="3967482288896653039">"Priority conversations"</string>
<string name="recent_conversations" msgid="8531874684782574622">"Recent conversations"</string>
<string name="okay" msgid="6490552955618608554">"OK"</string>
diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml
index 8403d40..f401fd4 100644
--- a/packages/SystemUI/res/values-en-rIN/strings.xml
+++ b/packages/SystemUI/res/values-en-rIN/strings.xml
@@ -1115,8 +1115,7 @@
<string name="basic_status" msgid="2315371112182658176">"Open conversation"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Conversation widgets"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Tap a conversation to add it to your home screen"</string>
- <!-- no translation found for no_conversations_text (5354115541282395015) -->
- <skip />
+ <string name="no_conversations_text" msgid="5354115541282395015">"Your recent conversations will show up here"</string>
<string name="priority_conversations" msgid="3967482288896653039">"Priority conversations"</string>
<string name="recent_conversations" msgid="8531874684782574622">"Recent conversations"</string>
<string name="okay" msgid="6490552955618608554">"OK"</string>
diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml
index 9a66364..a6987f4 100644
--- a/packages/SystemUI/res/values-fr-rCA/strings.xml
+++ b/packages/SystemUI/res/values-fr-rCA/strings.xml
@@ -1145,8 +1145,7 @@
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Affichez les messages récents, les appels manqués et les mises à jour d\'état"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Conversation"</string>
- <!-- no translation found for paused_by_dnd (7856941866433556428) -->
- <skip />
+ <string name="paused_by_dnd" msgid="7856941866433556428">"Interrompues par la fonctionnalité Ne pas déranger"</string>
<string name="new_notification_text_content_description" msgid="5574393603145263727">"<xliff:g id="NAME">%1$s</xliff:g> a envoyé un message"</string>
<string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> a envoyé une image"</string>
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Un problème est survenu lors de la lecture du niveau de charge de la pile"</string>
diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml
index 25968ef..3f4d524 100644
--- a/packages/SystemUI/res/values-gu/strings.xml
+++ b/packages/SystemUI/res/values-gu/strings.xml
@@ -1115,8 +1115,7 @@
<string name="basic_status" msgid="2315371112182658176">"વાતચીત ખોલો"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"વાતચીતના વિજેટ"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"તમારી હોમ સ્ક્રીનમાં વાતચીત ઉમેરવા માટે તેના પર ટૅપ કરો"</string>
- <!-- no translation found for no_conversations_text (5354115541282395015) -->
- <skip />
+ <string name="no_conversations_text" msgid="5354115541282395015">"તમારી તાજેતરની વાતચીતો અહીં બતાવવામાં આવશે"</string>
<string name="priority_conversations" msgid="3967482288896653039">"પ્રાધાન્યતા ધરાવતી વાતચીતો"</string>
<string name="recent_conversations" msgid="8531874684782574622">"તાજેતરની વાતચીતો"</string>
<string name="okay" msgid="6490552955618608554">"ઓકે"</string>
diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml
index 894e6ee..47a9820 100644
--- a/packages/SystemUI/res/values-hi/strings.xml
+++ b/packages/SystemUI/res/values-hi/strings.xml
@@ -1115,8 +1115,7 @@
<string name="basic_status" msgid="2315371112182658176">"ऐसी बातचीत जिसमें इंटरैक्शन डेटा मौजूद नहीं है"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"बातचीत विजेट"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"किसी बातचीत को होम स्क्रीन पर जोड़ने के लिए, उस बातचीत पर टैप करें"</string>
- <!-- no translation found for no_conversations_text (5354115541282395015) -->
- <skip />
+ <string name="no_conversations_text" msgid="5354115541282395015">"हाल ही में हुई बातचीत यहां दिखेंगी"</string>
<string name="priority_conversations" msgid="3967482288896653039">"प्राथमिकता वाली बातचीत"</string>
<string name="recent_conversations" msgid="8531874684782574622">"हाल ही में की गई बातचीत"</string>
<string name="okay" msgid="6490552955618608554">"ठीक है"</string>
diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml
index 404a8a7..2063d43 100644
--- a/packages/SystemUI/res/values-hy/strings.xml
+++ b/packages/SystemUI/res/values-hy/strings.xml
@@ -1115,8 +1115,7 @@
<string name="basic_status" msgid="2315371112182658176">"Բաց զրույց"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Զրույցի վիջեթներ"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Հպեք զրույցին՝ այն հիմնական էկրանին ավելացնելու համար"</string>
- <!-- no translation found for no_conversations_text (5354115541282395015) -->
- <skip />
+ <string name="no_conversations_text" msgid="5354115541282395015">"Ձեր վերջին զրույցները կցուցադրվեն այստեղ"</string>
<string name="priority_conversations" msgid="3967482288896653039">"Կարևոր զրույցներ"</string>
<string name="recent_conversations" msgid="8531874684782574622">"Վերջին հաղորդագրությունները"</string>
<string name="okay" msgid="6490552955618608554">"Եղավ"</string>
diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml
index c03c4b7..8cdc484 100644
--- a/packages/SystemUI/res/values-it/strings.xml
+++ b/packages/SystemUI/res/values-it/strings.xml
@@ -734,7 +734,7 @@
<string name="notification_channel_summary_low" msgid="4860617986908931158">"Nessun suono o vibrazione"</string>
<string name="notification_conversation_summary_low" msgid="1734433426085468009">"Nessun suono o vibrazione e appare più in basso nella sezione delle conversazioni"</string>
<string name="notification_channel_summary_default" msgid="3282930979307248890">"Può suonare o vibrare in base alle impostazioni del telefono"</string>
- <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"Può suonare o vibrare in base alle impostazioni del telefono. Conversazioni dalla bolla <xliff:g id="APP_NAME">%1$s</xliff:g> per impostazione predefinita."</string>
+ <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"Può suonare o vibrare in base alle impostazioni del telefono. Le conversazioni di <xliff:g id="APP_NAME">%1$s</xliff:g> appaiono come bolla per impostazione predefinita."</string>
<string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Mantiene la tua attenzione con una scorciatoia mobile a questi contenuti."</string>
<string name="notification_channel_summary_automatic" msgid="5813109268050235275">"Fai stabilire al sistema se questa notifica deve emettere suoni o vibrazioni"</string>
<string name="notification_channel_summary_automatic_alerted" msgid="954166812246932240">"<b>Stato:</b> promossa a Predefinita"</string>
diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml
index 0742bf0..065167a 100644
--- a/packages/SystemUI/res/values-ja/strings.xml
+++ b/packages/SystemUI/res/values-ja/strings.xml
@@ -1115,8 +1115,7 @@
<string name="basic_status" msgid="2315371112182658176">"空の会話"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"会話ウィジェット"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"会話をタップするとホーム画面に追加されます"</string>
- <!-- no translation found for no_conversations_text (5354115541282395015) -->
- <skip />
+ <string name="no_conversations_text" msgid="5354115541282395015">"最近の会話がここに表示されます"</string>
<string name="priority_conversations" msgid="3967482288896653039">"優先度の高い会話"</string>
<string name="recent_conversations" msgid="8531874684782574622">"最近の会話"</string>
<string name="okay" msgid="6490552955618608554">"OK"</string>
diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml
index daca7e5..41b6c44 100644
--- a/packages/SystemUI/res/values-kn/strings.xml
+++ b/packages/SystemUI/res/values-kn/strings.xml
@@ -1145,8 +1145,7 @@
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"ಇತ್ತೀಚಿನ ಸಂದೇಶಗಳು, ಮಿಸ್ಡ್ ಕಾಲ್ಗಳು ಮತ್ತು ಸ್ಥಿತಿ ಅಪ್ಡೇಟ್ಗಳು"</string>
<string name="people_tile_title" msgid="6589377493334871272">"ಸಂಭಾಷಣೆ"</string>
- <!-- no translation found for paused_by_dnd (7856941866433556428) -->
- <skip />
+ <string name="paused_by_dnd" msgid="7856941866433556428">"\'ಅಡಚಣೆ ಮಾಡಬೇಡಿ\' ನಿಂದ ವಿರಾಮಗೊಳಿಸಲಾಗಿದೆ"</string>
<string name="new_notification_text_content_description" msgid="5574393603145263727">"<xliff:g id="NAME">%1$s</xliff:g> ಸಂದೇಶವನ್ನು ಕಳುಹಿಸಿದ್ದಾರೆ"</string>
<string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> ಅವರು ಚಿತ್ರವನ್ನು ಕಳುಹಿಸಿದ್ದಾರೆ"</string>
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"ನಿಮ್ಮ ಬ್ಯಾಟರಿ ಮೀಟರ್ ಓದುವಾಗ ಸಮಸ್ಯೆ ಎದುರಾಗಿದೆ"</string>
diff --git a/packages/SystemUI/res/values-lo/strings.xml b/packages/SystemUI/res/values-lo/strings.xml
index fe8211a..27d6848 100644
--- a/packages/SystemUI/res/values-lo/strings.xml
+++ b/packages/SystemUI/res/values-lo/strings.xml
@@ -1115,8 +1115,7 @@
<string name="basic_status" msgid="2315371112182658176">"ເປີດການສົນທະນາ"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"ວິດເຈັດການສົນທະນາ"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"ແຕະໃສ່ການສົນທະນາໃດໜຶ່ງເພື່ອເພີ່ມມັນໃສ່ໂຮມສະກຣີນຂອງທ່ານ"</string>
- <!-- no translation found for no_conversations_text (5354115541282395015) -->
- <skip />
+ <string name="no_conversations_text" msgid="5354115541282395015">"ການສົນທະນາຫຼ້າສຸດຂອງທ່ານຈະສະແດງຢູ່ບ່ອນນີ້"</string>
<string name="priority_conversations" msgid="3967482288896653039">"ການສົນທະນາສຳຄັນ"</string>
<string name="recent_conversations" msgid="8531874684782574622">"ການສົນທະນາຫຼ້າສຸດ"</string>
<string name="okay" msgid="6490552955618608554">"ຕົກລົງ"</string>
diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml
index 83efb96..d96aa06 100644
--- a/packages/SystemUI/res/values-ml/strings.xml
+++ b/packages/SystemUI/res/values-ml/strings.xml
@@ -734,7 +734,7 @@
<string name="notification_channel_summary_low" msgid="4860617986908931158">"ശബ്ദമോ വൈബ്രേഷനോ ഇല്ല"</string>
<string name="notification_conversation_summary_low" msgid="1734433426085468009">"ശബ്ദമോ വൈബ്രേഷനോ ഇല്ല, സംഭാഷണ വിഭാഗത്തിന് താഴെയായി ദൃശ്യമാകും"</string>
<string name="notification_channel_summary_default" msgid="3282930979307248890">"ഫോൺ ക്രമീകരണം അടിസ്ഥാനമാക്കി റിംഗ്/വൈബ്രേറ്റ് ചെയ്യും"</string>
- <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"ഫോൺ ക്രമീകരണം അടിസ്ഥാനമാക്കി റിംഗ് ചെയ്തേക്കാം അല്ലെങ്കിൽ വൈബ്രേറ്റ് ചെയ്തേക്കാം. <xliff:g id="APP_NAME">%1$s</xliff:g>-ൽ നിന്നുള്ള സംഭാഷണങ്ങൾ ഡിഫോൾട്ടായി ബബിൾ ആവുന്നു."</string>
+ <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"ഫോൺ ക്രമീകരണം അടിസ്ഥാനമാക്കി റിംഗ്/വൈബ്രേറ്റ് ചെയ്തേക്കാം. <xliff:g id="APP_NAME">%1$s</xliff:g>-ൽ നിന്നുള്ള സംഭാഷണങ്ങൾ ഡിഫോൾട്ടായി ബബിൾ ചെയ്യുന്നു."</string>
<string name="notification_channel_summary_bubble" msgid="7235935211580860537">"ഈ ഉള്ളടക്കത്തിലേക്ക് ഒരു ഫ്ലോട്ടിംഗ് കുറുക്കുവഴി ഉപയോഗിച്ച് നിങ്ങളുടെ ശ്രദ്ധ നിലനിർത്തുന്നു."</string>
<string name="notification_channel_summary_automatic" msgid="5813109268050235275">"ഈ അറിയിപ്പ് വരുമ്പോൾ ശബ്ദിക്കുകയാണോ വൈബ്രേറ്റ് ചെയ്യുകയാണോ വേണ്ടതെന്ന് നിർണ്ണയിക്കാൻ സിസ്റ്റത്തെ അനുവദിക്കുക"</string>
<string name="notification_channel_summary_automatic_alerted" msgid="954166812246932240">"<b>നില:</b> ഡിഫോൾട്ടാക്കി പ്രമോട്ട് ചെയ്തു"</string>
@@ -744,7 +744,7 @@
<string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"സംഭാഷണ അറിയിപ്പുകളുടെ മുകളിലും സ്ക്രീൻ ലോക്കായിരിക്കുമ്പോൾ ഒരു പ്രൊഫൈൽ ചിത്രമായും കാണിക്കുന്നു"</string>
<string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"സംഭാഷണ അറിയിപ്പുകളുടെ മുകളിലും സ്ക്രീൻ ലോക്കായിരിക്കുമ്പോൾ ഒരു പ്രൊഫൈൽ ചിത്രമായും കാണിക്കുന്നു, ഒരു ബബിൾ രൂപത്തിൽ ദൃശ്യമാകുന്നു"</string>
<string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"സംഭാഷണ അറിയിപ്പുകളുടെ മുകളിലും സ്ക്രീൻ ലോക്കായിരിക്കുമ്പോൾ ഒരു പ്രൊഫൈൽ ചിത്രമായും കാണിക്കുന്നു, ശല്യപ്പെടുത്തരുത് മോഡ് തടസ്സപ്പെടുത്തുന്നു"</string>
- <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"സംഭാഷണ അറിയിപ്പുകളുടെ മുകളിലും സ്ക്രീൻ ലോക്കായിരിക്കുമ്പോൾ ഒരു പ്രൊഫൈൽ ചിത്രമായും കാണിക്കുന്നു, ഒരു ബബിൾ രൂപത്തിൽ ദൃശ്യമാകുന്നു, ശല്യപ്പെടുത്തരുത് മോഡ് തടസ്സപ്പെടുത്തുന്നു"</string>
+ <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"സംഭാഷണ അറിയിപ്പുകളുടെ മുകളിലും സ്ക്രീൻ ലോക്കായിരിക്കുമ്പോൾ ഒരു പ്രൊഫൈൽ ചിത്രമായും ബബിൾ രൂപത്തിൽ ദൃശ്യമാകുന്നു, ശല്യപ്പെടുത്തരുത് മോഡ് തടസ്സപ്പെടുത്തുന്നു"</string>
<string name="notification_conversation_channel_settings" msgid="2409977688430606835">"ക്രമീകരണം"</string>
<string name="notification_priority_title" msgid="2079708866333537093">"മുൻഗണന"</string>
<string name="no_shortcut" msgid="8257177117568230126">"സംഭാഷണ ഫീച്ചറുകളെ <xliff:g id="APP_NAME">%1$s</xliff:g> പിന്തുണയ്ക്കുന്നില്ല"</string>
diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml
index 2e3db10..54d1a5f 100644
--- a/packages/SystemUI/res/values-my/strings.xml
+++ b/packages/SystemUI/res/values-my/strings.xml
@@ -1115,8 +1115,7 @@
<string name="basic_status" msgid="2315371112182658176">"စကားဝိုင်းကို ဖွင့်ရန်"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"စကားဝိုင်း ဝိဂျက်များ"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"စကားဝိုင်းကို သင်၏ ‘ပင်မစာမျက်နှာ’ သို့ထည့်ရန် တို့ပါ"</string>
- <!-- no translation found for no_conversations_text (5354115541282395015) -->
- <skip />
+ <string name="no_conversations_text" msgid="5354115541282395015">"သင်၏မကြာသေးမီက စကားဝိုင်းများကို ဤနေရာတွင် ပြပါမည်"</string>
<string name="priority_conversations" msgid="3967482288896653039">"ဦးစားပေး စကားဝိုင်းများ"</string>
<string name="recent_conversations" msgid="8531874684782574622">"မကြာသေးမီက စကားဝိုင်းများ"</string>
<string name="okay" msgid="6490552955618608554">"OK"</string>
diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml
index 4802686a..9d84910 100644
--- a/packages/SystemUI/res/values-sl/strings.xml
+++ b/packages/SystemUI/res/values-sl/strings.xml
@@ -749,8 +749,8 @@
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"<b>Stanje:</b> Uvrščeno nižje"</string>
<string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"Prikaz na vrhu razdelka z obvestili za pogovor in kot profilna slika na zaklenjenem zaslonu"</string>
<string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"Prikaz v obliki oblačka na vrhu razdelka z obvestili za pogovor in kot profilna slika na zaklenjenem zaslonu."</string>
- <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"Prikaz na vrhu razdelka z obvestili za pogovor in kot profilna slika na zaklenjenem zaslonu, preglasitev načina Ne moti"</string>
- <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Prikaz v obliki oblačka na vrhu razdelka z obvestili za pogovor in kot profilna slika na zaklenjenem zaslonu, preglasitev načina Ne moti"</string>
+ <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"Prikaz na vrhu razdelka z obvestili za pogovor in kot profilna slika na zaklenjenem zaslonu, preglasitev načina Ne moti."</string>
+ <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Prikaz v obliki oblačka na vrhu razdelka z obvestili za pogovor in kot profilna slika na zaklenjenem zaslonu, preglasitev načina Ne moti."</string>
<string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Nastavitve"</string>
<string name="notification_priority_title" msgid="2079708866333537093">"Prednostno"</string>
<string name="no_shortcut" msgid="8257177117568230126">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> ne podpira pogovornih funkcij."</string>
diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml
index 2a91263..0ec1d1f 100644
--- a/packages/SystemUI/res/values-ta/strings.xml
+++ b/packages/SystemUI/res/values-ta/strings.xml
@@ -137,10 +137,10 @@
<string name="accessibility_phone_button" msgid="4256353121703100427">"ஃபோன்"</string>
<string name="accessibility_voice_assist_button" msgid="6497706615649754510">"குரல் உதவி"</string>
<string name="accessibility_wallet_button" msgid="1458258783460555507">"வாலட்"</string>
- <string name="accessibility_unlock_button" msgid="122785427241471085">"திற"</string>
+ <string name="accessibility_unlock_button" msgid="122785427241471085">"அன்லாக் செய்"</string>
<string name="accessibility_lock_icon" msgid="661492842417875775">"சாதனம் பூட்டப்பட்டுள்ளது"</string>
<string name="accessibility_waiting_for_fingerprint" msgid="5209142744692162598">"கைரேகைக்காகக் காத்திருக்கிறது"</string>
- <string name="accessibility_unlock_without_fingerprint" msgid="1811563723195375298">"உங்கள் கைரேகையைப் பயன்படுத்தாமல் திறக்கவும்"</string>
+ <string name="accessibility_unlock_without_fingerprint" msgid="1811563723195375298">"உங்கள் கைரேகையைப் பயன்படுத்தாமல் அன்லாக் செய்யுங்கள்"</string>
<string name="accessibility_scanning_face" msgid="3093828357921541387">"முகத்தை ஸ்கேன் செய்கிறது"</string>
<string name="accessibility_send_smart_reply" msgid="8885032190442015141">"அனுப்பு"</string>
<string name="accessibility_manage_notification" msgid="582215815790143983">"அறிவிப்புகளை நிர்வகிக்கும் பட்டன்"</string>
@@ -586,10 +586,10 @@
<string name="monitoring_description_app_work" msgid="3713084153786663662">"உங்கள் பணிக் கணக்கை <xliff:g id="ORGANIZATION">%1$s</xliff:g> நிர்வகிக்கிறது. மின்னஞ்சல்கள், ஆப்ஸ், இணையதளங்கள் உட்பட உங்கள் பணி நெட்வொர்க் செயல்பாட்டைக் கண்காணிக்கக்கூடிய <xliff:g id="APPLICATION">%2$s</xliff:g> உடன் அது இணைக்கப்பட்டுள்ளது.\n\nமேலும் தகவலுக்கு, நிர்வாகியைத் தொடர்புகொள்ளவும்."</string>
<string name="monitoring_description_app_personal_work" msgid="6175816356939166101">"உங்கள் பணிக் கணக்கை <xliff:g id="ORGANIZATION">%1$s</xliff:g> நிர்வகிக்கிறது. மின்னஞ்சல்கள், ஆப்ஸ், இணையதளங்கள் உட்பட உங்கள் பணி நெட்வொர்க் செயல்பாட்டைக் கண்காணிக்கக்கூடிய <xliff:g id="APPLICATION_WORK">%2$s</xliff:g> உடன் அது இணைக்கப்பட்டுள்ளது.\n\nஉங்கள் தனிப்பட்ட நெட்வொர்க் செயல்பாட்டைக் கண்காணிக்கக்கூடிய <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g> உடனும் இணைக்கப்பட்டுள்ளீர்கள்."</string>
<string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"TrustAgent இதைத் திறந்தே வைத்துள்ளது"</string>
- <string name="keyguard_indication_trust_disabled" msgid="6820793704816727918">"நீங்கள் கைமுறையாகத் திறக்கும் வரை, சாதனம் பூட்டப்பட்டிருக்கும்"</string>
+ <string name="keyguard_indication_trust_disabled" msgid="6820793704816727918">"நீங்கள் கைமுறையாக அன்லாக் செய்யும் வரை, சாதனம் பூட்டப்பட்டிருக்கும்"</string>
<string name="keyguard_indication_trust_unlocked_plugged_in" msgid="2323452175329362855">"<xliff:g id="KEYGUARD_INDICATION">%1$s</xliff:g>\n<xliff:g id="POWER_INDICATION">%2$s</xliff:g>"</string>
<string name="hidden_notifications_title" msgid="1782412844777612795">"விரைவாக அறிவிப்புகளைப் பெறுதல்"</string>
- <string name="hidden_notifications_text" msgid="5899627470450792578">"திறக்கும் முன் அவற்றைப் பார்க்கவும்"</string>
+ <string name="hidden_notifications_text" msgid="5899627470450792578">"அன்லாக் செய்யும் முன் அவற்றைப் பார்க்கவும்"</string>
<string name="hidden_notifications_cancel" msgid="4805370226181001278">"வேண்டாம்"</string>
<string name="hidden_notifications_setup" msgid="2064795578526982467">"அமை"</string>
<string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml
index e63aaad..64b2113 100644
--- a/packages/SystemUI/res/values-th/strings.xml
+++ b/packages/SystemUI/res/values-th/strings.xml
@@ -1145,8 +1145,7 @@
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"ดูข้อความล่าสุด สายที่ไม่ได้รับ และการอัปเดตสถานะ"</string>
<string name="people_tile_title" msgid="6589377493334871272">"การสนทนา"</string>
- <!-- no translation found for paused_by_dnd (7856941866433556428) -->
- <skip />
+ <string name="paused_by_dnd" msgid="7856941866433556428">"หยุดชั่วคราวโดยฟีเจอร์ห้ามรบกวน"</string>
<string name="new_notification_text_content_description" msgid="5574393603145263727">"<xliff:g id="NAME">%1$s</xliff:g> ส่งข้อความ"</string>
<string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> ส่งรูปภาพ"</string>
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"พบปัญหาในการอ่านเครื่องวัดแบตเตอรี่"</string>
diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml
index d785bdf..0c1d6c6 100644
--- a/packages/SystemUI/res/values-uz/strings.xml
+++ b/packages/SystemUI/res/values-uz/strings.xml
@@ -1115,8 +1115,7 @@
<string name="basic_status" msgid="2315371112182658176">"Suhbatni ochish"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Suhbat vidjetlari"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Bosh ekranga chiqariladigan suhbat ustiga bosing"</string>
- <!-- no translation found for no_conversations_text (5354115541282395015) -->
- <skip />
+ <string name="no_conversations_text" msgid="5354115541282395015">"Oxirgi suhbatlaringiz shu yerda chiqadi"</string>
<string name="priority_conversations" msgid="3967482288896653039">"Muhim suhbatlar"</string>
<string name="recent_conversations" msgid="8531874684782574622">"Oxirgi suhbatlar"</string>
<string name="okay" msgid="6490552955618608554">"OK"</string>
diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml
index 9cd29ae..7f2edd9 100644
--- a/packages/SystemUI/res/values-zh-rHK/strings.xml
+++ b/packages/SystemUI/res/values-zh-rHK/strings.xml
@@ -1115,8 +1115,7 @@
<string name="basic_status" msgid="2315371112182658176">"開啟對話"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"對話小工具"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"輕按對話即可新增至主畫面"</string>
- <!-- no translation found for no_conversations_text (5354115541282395015) -->
- <skip />
+ <string name="no_conversations_text" msgid="5354115541282395015">"您最近的對話會在這裡顯示"</string>
<string name="priority_conversations" msgid="3967482288896653039">"優先對話"</string>
<string name="recent_conversations" msgid="8531874684782574622">"最近的對話"</string>
<string name="okay" msgid="6490552955618608554">"確定"</string>
diff --git a/packages/SystemUI/res/values/attrs.xml b/packages/SystemUI/res/values/attrs.xml
index d2ed601..b5337d3 100644
--- a/packages/SystemUI/res/values/attrs.xml
+++ b/packages/SystemUI/res/values/attrs.xml
@@ -143,6 +143,8 @@
<attr name="handleThickness" format="dimension" />
<attr name="handleColor" format="color" />
<attr name="scrimColor" format="color" />
+ <!-- Int [0,255] for the alpha to be applied to scrimColor -->
+ <attr name="scrimAlpha" format="integer" />
<attr name="containerBackgroundColor" format="color" />
<attr name="isVertical" format="boolean" />
@@ -179,6 +181,7 @@
<attr name="handleThickness" />
<attr name="handleColor" />
<attr name="scrimColor" />
+ <attr name="scrimAlpha" />
<attr name="containerBackgroundColor" />
</declare-styleable>
@@ -186,6 +189,7 @@
<attr name="handleThickness" />
<attr name="handleColor" />
<attr name="scrimColor" />
+ <attr name="scrimAlpha" />
<attr name="borderThickness" format="dimension" />
<attr name="borderColor" format="color" />
</declare-styleable>
diff --git a/packages/SystemUI/res/values/colors.xml b/packages/SystemUI/res/values/colors.xml
index e7edb0e..2260d21 100644
--- a/packages/SystemUI/res/values/colors.xml
+++ b/packages/SystemUI/res/values/colors.xml
@@ -199,9 +199,6 @@
<color name="global_screenshot_button_ripple">#1f000000</color>
<color name="global_screenshot_background_protection_start">#40000000</color> <!-- 25% black -->
- <!-- Long screenshot UI -->
- <color name="screenshot_crop_scrim">#6444</color>
-
<!-- GM2 colors -->
<color name="GM2_grey_50">#F8F9FA</color>
<color name="GM2_grey_100">#F1F3F4</color>
@@ -272,6 +269,7 @@
<color name="misalignment_text_color">#F28B82</color>
<color name="screenrecord_status_color">#E94235</color>
+ <color name="screenrecord_icon_color">#D93025</color><!-- red 600 -->
<color name="privacy_chip_background">#3ddc84</color>
diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml
index ea54bb4..a526803 100644
--- a/packages/SystemUI/res/values/dimens.xml
+++ b/packages/SystemUI/res/values/dimens.xml
@@ -1398,9 +1398,11 @@
<dimen name="controls_dialog_padding">32dp</dimen>
<dimen name="controls_dialog_control_width">200dp</dimen>
- <!-- Screen Record -->
- <dimen name="screenrecord_dialog_padding">18dp</dimen>
- <dimen name="screenrecord_logo_size">24dp</dimen>
+ <!-- Screen record dialog -->
+ <dimen name="screenrecord_option_padding">18dp</dimen>
+ <dimen name="screenrecord_logo_size">26dp</dimen>
+ <dimen name="screenrecord_option_icon_size">24dp</dimen>
+ <!-- Screen record status bar icon -->
<dimen name="screenrecord_status_text_size">14sp</dimen>
<dimen name="screenrecord_status_icon_radius">7dp</dimen>
<dimen name="screenrecord_status_icon_width">21dp</dimen>
diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml
index bc1c67c..e705803 100644
--- a/packages/SystemUI/res/values/strings.xml
+++ b/packages/SystemUI/res/values/strings.xml
@@ -1661,6 +1661,8 @@
<string name="wallet_action_button_label_unlock">Unlock to pay</string>
<!-- Secondary label of the quick access wallet tile if no card. [CHAR LIMIT=NONE] -->
<string name="wallet_secondary_label_no_card">Not set up</string>
+ <!-- Secondary label of the quick access wallet tile if wallet is still updating. [CHAR LIMIT=NONE] -->
+ <string name="wallet_secondary_label_updating">Updating</string>
<!-- Secondary label of the quick access wallet tile if device locked. [CHAR LIMIT=NONE] -->
<string name="wallet_secondary_label_device_locked">Unlock to use</string>
<!-- Message shown when an unknown failure occurred when fetching cards. [CHAR LIMIT=NONE] -->
diff --git a/packages/SystemUI/res/values/styles.xml b/packages/SystemUI/res/values/styles.xml
index 6d25a5b..17a984e 100644
--- a/packages/SystemUI/res/values/styles.xml
+++ b/packages/SystemUI/res/values/styles.xml
@@ -697,6 +697,15 @@
<item name="android:windowCloseOnTouchOutside">true</item>
</style>
+ <style name="ScreenRecord.Switch">
+ <item name="android:textAppearance">?android:attr/textAppearanceMedium</item>
+ <item name="android:fontFamily">@*android:string/config_headlineFontFamily</item>
+ <item name="android:switchMinWidth">52dp</item>
+ <item name="android:minHeight">48dp</item>
+ <item name="android:track">@drawable/settingslib_switch_track</item>
+ <item name="android:thumb">@drawable/settingslib_switch_thumb</item>
+ </style>
+
<!-- Screenshots -->
<style name="LongScreenshotActivity" parent="@android:style/Theme.DeviceDefault.DayNight">
<item name="android:windowNoTitle">true</item>
diff --git a/packages/SystemUI/res/values/tiles_states_strings.xml b/packages/SystemUI/res/values/tiles_states_strings.xml
index 5ac7c1d..a0920bb 100644
--- a/packages/SystemUI/res/values/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values/tiles_states_strings.xml
@@ -40,9 +40,9 @@
subtitle, so some of these may never appear on screen. They should still be translated as
if they could appear. [CHAR LIMIT=32] -->
<string-array name="tile_states_internet">
- <item>@string/tile_unavailable</item>
- <item>@string/switch_bar_off</item>
- <item>@string/switch_bar_on</item>
+ <item>Unavailable</item>
+ <item>Off</item>
+ <item>On</item>
</string-array>
<!-- State names for wifi tile: unavailable, off, on.
@@ -50,9 +50,9 @@
subtitle, so some of these may never appear on screen. They should still be translated as
if they could appear. [CHAR LIMIT=32] -->
<string-array name="tile_states_wifi">
- <item>@string/tile_unavailable</item>
- <item>@string/switch_bar_off</item>
- <item>@string/switch_bar_on</item>
+ <item>Unavailable</item>
+ <item>Off</item>
+ <item>On</item>
</string-array>
<!-- State names for cell (data) tile: unavailable, off, on.
@@ -60,9 +60,9 @@
subtitle, so some of these may never appear on screen. They should still be translated as
if they could appear.[CHAR LIMIT=32] -->
<string-array name="tile_states_cell">
- <item>@string/tile_unavailable</item>
- <item>@string/switch_bar_off</item>
- <item>@string/switch_bar_on</item>
+ <item>Unavailable</item>
+ <item>Off</item>
+ <item>On</item>
</string-array>
<!-- State names for battery (saver) tile: unavailable, off, on.
@@ -70,9 +70,9 @@
subtitle, so some of these may never appear on screen. They should still be translated as
if they could appear. [CHAR LIMIT=32] -->
<string-array name="tile_states_battery">
- <item>@string/tile_unavailable</item>
- <item>@string/switch_bar_off</item>
- <item>@string/switch_bar_on</item>
+ <item>Unavailable</item>
+ <item>Off</item>
+ <item>On</item>
</string-array>
<!-- State names for dnd (Do not disturb) tile: unavailable, off, on.
@@ -80,9 +80,9 @@
subtitle, so some of these may never appear on screen. They should still be translated as
if they could appear. [CHAR LIMIT=32] -->
<string-array name="tile_states_dnd">
- <item>@string/tile_unavailable</item>
- <item>@string/switch_bar_off</item>
- <item>@string/switch_bar_on</item>
+ <item>Unavailable</item>
+ <item>Off</item>
+ <item>On</item>
</string-array>
<!-- State names for flashlight tile: unavailable, off, on.
@@ -90,9 +90,9 @@
subtitle, so some of these may never appear on screen. They should still be translated as
if they could appear. [CHAR LIMIT=32] -->
<string-array name="tile_states_flashlight">
- <item>@string/tile_unavailable</item>
- <item>@string/switch_bar_off</item>
- <item>@string/switch_bar_on</item>
+ <item>Unavailable</item>
+ <item>Off</item>
+ <item>On</item>
</string-array>
<!-- State names for rotation (lock) tile: unavailable, off, on.
@@ -100,9 +100,9 @@
subtitle, so some of these may never appear on screen. They should still be translated as
if they could appear. [CHAR LIMIT=32] -->
<string-array name="tile_states_rotation">
- <item>@string/tile_unavailable</item>
- <item>@string/switch_bar_off</item>
- <item>@string/switch_bar_on</item>
+ <item>Unavailable</item>
+ <item>Off</item>
+ <item>On</item>
</string-array>
<!-- State names for bt (bluetooth) tile: unavailable, off, on.
@@ -110,16 +110,16 @@
subtitle, so some of these may never appear on screen. They should still be translated as
if they could appear. [CHAR LIMIT=32] -->
<string-array name="tile_states_bt">
- <item>@string/tile_unavailable</item>
- <item>@string/switch_bar_off</item>
- <item>@string/switch_bar_on</item>
+ <item>Unavailable</item>
+ <item>Off</item>
+ <item>On</item>
</string-array>
<!-- State names for airplane tile: unavailable, off, on [CHAR LIMIT=32] -->
<string-array name="tile_states_airplane">
- <item>@string/tile_unavailable</item>
- <item>@string/switch_bar_off</item>
- <item>@string/switch_bar_on</item>
+ <item>Unavailable</item>
+ <item>Off</item>
+ <item>On</item>
</string-array>
<!-- State names for location tile: unavailable, off, on.
@@ -127,9 +127,9 @@
subtitle, so some of these may never appear on screen. They should still be translated as
if they could appear. [CHAR LIMIT=32] -->
<string-array name="tile_states_location">
- <item>@string/tile_unavailable</item>
- <item>@string/switch_bar_off</item>
- <item>@string/switch_bar_on</item>
+ <item>Unavailable</item>
+ <item>Off</item>
+ <item>On</item>
</string-array>
<!-- State names for hotspot tile: unavailable, off, on.
@@ -137,9 +137,9 @@
subtitle, so some of these may never appear on screen. They should still be translated as
if they could appear. [CHAR LIMIT=32] -->
<string-array name="tile_states_hotspot">
- <item>@string/tile_unavailable</item>
- <item>@string/switch_bar_off</item>
- <item>@string/switch_bar_on</item>
+ <item>Unavailable</item>
+ <item>Off</item>
+ <item>On</item>
</string-array>
<!-- State names for (color) inversion tile: unavailable, off, on.
@@ -147,9 +147,9 @@
subtitle, so some of these may never appear on screen. They should still be translated as
if they could appear. [CHAR LIMIT=32] -->
<string-array name="tile_states_inversion">
- <item>@string/tile_unavailable</item>
- <item>@string/switch_bar_off</item>
- <item>@string/switch_bar_on</item>
+ <item>Unavailable</item>
+ <item>Off</item>
+ <item>On</item>
</string-array>
<!-- State names for (data) saver tile: unavailable, off, on.
@@ -157,9 +157,9 @@
subtitle, so some of these may never appear on screen. They should still be translated as
if they could appear. [CHAR LIMIT=32] -->
<string-array name="tile_states_saver">
- <item>@string/tile_unavailable</item>
- <item>@string/switch_bar_off</item>
- <item>@string/switch_bar_on</item>
+ <item>Unavailable</item>
+ <item>Off</item>
+ <item>On</item>
</string-array>
<!-- State names for dark (mode) tile: unavailable, off, on.
@@ -167,9 +167,9 @@
subtitle, so some of these may never appear on screen. They should still be translated as
if they could appear. [CHAR LIMIT=32] -->
<string-array name="tile_states_dark">
- <item>@string/tile_unavailable</item>
- <item>@string/switch_bar_off</item>
- <item>@string/switch_bar_on</item>
+ <item>Unavailable</item>
+ <item>Off</item>
+ <item>On</item>
</string-array>
<!-- State names for work (mode) tile: unavailable, off, on.
@@ -177,9 +177,9 @@
subtitle, so some of these may never appear on screen. They should still be translated as
if they could appear. [CHAR LIMIT=32] -->
<string-array name="tile_states_work">
- <item>@string/tile_unavailable</item>
- <item>@string/switch_bar_off</item>
- <item>@string/switch_bar_on</item>
+ <item>Unavailable</item>
+ <item>Off</item>
+ <item>On</item>
</string-array>
<!-- State names for cast tile: unavailable, off, on.
@@ -187,9 +187,9 @@
subtitle, so some of these may never appear on screen. They should still be translated as
if they could appear. [CHAR LIMIT=32] -->
<string-array name="tile_states_cast">
- <item>@string/tile_unavailable</item>
- <item>@string/switch_bar_off</item>
- <item>@string/switch_bar_on</item>
+ <item>Unavailable</item>
+ <item>Off</item>
+ <item>On</item>
</string-array>
<!-- State names for night (light) tile: unavailable, off, on.
@@ -197,9 +197,9 @@
subtitle, so some of these may never appear on screen. They should still be translated as
if they could appear. [CHAR LIMIT=32] -->
<string-array name="tile_states_night">
- <item>@string/tile_unavailable</item>
- <item>@string/switch_bar_off</item>
- <item>@string/switch_bar_on</item>
+ <item>Unavailable</item>
+ <item>Off</item>
+ <item>On</item>
</string-array>
<!-- State names for screenrecord tile: unavailable, off, on.
@@ -207,9 +207,9 @@
subtitle, so some of these may never appear on screen. They should still be translated as
if they could appear. [CHAR LIMIT=32] -->
<string-array name="tile_states_screenrecord">
- <item>@string/tile_unavailable</item>
- <item>@string/switch_bar_off</item>
- <item>@string/switch_bar_on</item>
+ <item>Unavailable</item>
+ <item>Off</item>
+ <item>On</item>
</string-array>
<!-- State names for reverse (charging) tile: unavailable, off, on.
@@ -217,9 +217,9 @@
subtitle, so some of these may never appear on screen. They should still be translated as
if they could appear. [CHAR LIMIT=32] -->
<string-array name="tile_states_reverse">
- <item>@string/tile_unavailable</item>
- <item>@string/switch_bar_off</item>
- <item>@string/switch_bar_on</item>
+ <item>Unavailable</item>
+ <item>Off</item>
+ <item>On</item>
</string-array>
<!-- State names for reduce_brightness tile: unavailable, off, on.
@@ -227,9 +227,9 @@
subtitle, so some of these may never appear on screen. They should still be translated as
if they could appear. [CHAR LIMIT=32] -->
<string-array name="tile_states_reduce_brightness">
- <item>@string/tile_unavailable</item>
- <item>@string/switch_bar_off</item>
- <item>@string/switch_bar_on</item>
+ <item>Unavailable</item>
+ <item>Off</item>
+ <item>On</item>
</string-array>
<!-- State names for cameratoggle tile: unavailable, off, on.
@@ -237,9 +237,9 @@
subtitle, so some of these may never appear on screen. They should still be translated as
if they could appear.[CHAR LIMIT=32] -->
<string-array name="tile_states_cameratoggle">
- <item>@string/tile_unavailable</item>
- <item>@string/switch_bar_off</item>
- <item>@string/switch_bar_on</item>
+ <item>Unavailable</item>
+ <item>Off</item>
+ <item>On</item>
</string-array>
<!-- State names for mictoggle tile: unavailable, off, on.
@@ -247,9 +247,9 @@
subtitle, so some of these may never appear on screen. They should still be translated as
if they could appear. [CHAR LIMIT=32] -->
<string-array name="tile_states_mictoggle">
- <item>@string/tile_unavailable</item>
- <item>@string/switch_bar_off</item>
- <item>@string/switch_bar_on</item>
+ <item>Unavailable</item>
+ <item>Off</item>
+ <item>On</item>
</string-array>
<!-- State names for (home) controls tile: unavailable, off, on.
@@ -257,9 +257,9 @@
subtitle, so some of these may never appear on screen. They should still be translated as
if they could appear. [CHAR LIMIT=32] -->
<string-array name="tile_states_controls">
- <item>@string/tile_unavailable</item>
- <item>@string/switch_bar_off</item>
- <item>@string/switch_bar_on</item>
+ <item>Unavailable</item>
+ <item>Off</item>
+ <item>On</item>
</string-array>
<!-- State names for (quick access) wallet tile: unavailable, off, on.
@@ -267,9 +267,9 @@
subtitle, so some of these may never appear on screen. They should still be translated as
if they could appear. [CHAR LIMIT=32] -->
<string-array name="tile_states_wallet">
- <item>@string/tile_unavailable</item>
- <item>@string/switch_bar_off</item>
- <item>@string/switch_bar_on</item>
+ <item>Unavailable</item>
+ <item>Off</item>
+ <item>On</item>
</string-array>
<!-- State names for alarm tile: unavailable, off, on.
@@ -277,8 +277,8 @@
subtitle, so some of these may never appear on screen. They should still be translated as
if they could appear. [CHAR LIMIT=32] -->
<string-array name="tile_states_alarm">
- <item>@string/tile_unavailable</item>
- <item>@string/switch_bar_off</item>
- <item>@string/switch_bar_on</item>
+ <item>Unavailable</item>
+ <item>Off</item>
+ <item>On</item>
</string-array>
</resources>
\ No newline at end of file
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/plugins/PluginInstanceManager.java b/packages/SystemUI/shared/src/com/android/systemui/shared/plugins/PluginInstanceManager.java
index 2b35bcd..c90833c 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/plugins/PluginInstanceManager.java
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/plugins/PluginInstanceManager.java
@@ -345,7 +345,7 @@
// Create our own ClassLoader so we can use our own code as the parent.
ClassLoader classLoader = mManager.getClassLoader(info);
Context pluginContext = new PluginContextWrapper(
- mContext.createApplicationContext(info, 0), classLoader);
+ mContext.createPackageContext(pkg, 0), classLoader);
Class<?> pluginClass = Class.forName(cls, true, classLoader);
// TODO: Only create the plugin before version check if we need it for
// legacy version check.
diff --git a/packages/SystemUI/src/com/android/keyguard/AnimatableClockController.java b/packages/SystemUI/src/com/android/keyguard/AnimatableClockController.java
index 08076c1..4b3af34 100644
--- a/packages/SystemUI/src/com/android/keyguard/AnimatableClockController.java
+++ b/packages/SystemUI/src/com/android/keyguard/AnimatableClockController.java
@@ -94,7 +94,9 @@
@Override
public void onBatteryLevelChanged(int level, boolean pluggedIn, boolean charging) {
if (mKeyguardShowing && !mIsCharging && charging) {
- mView.animateCharge(mIsDozing);
+ mView.animateCharge(() -> {
+ return mStatusBarStateController.isDozing();
+ });
}
mIsCharging = charging;
}
diff --git a/packages/SystemUI/src/com/android/keyguard/AnimatableClockView.java b/packages/SystemUI/src/com/android/keyguard/AnimatableClockView.java
index 63867c0..58b3865 100644
--- a/packages/SystemUI/src/com/android/keyguard/AnimatableClockView.java
+++ b/packages/SystemUI/src/com/android/keyguard/AnimatableClockView.java
@@ -196,20 +196,20 @@
null /* onAnimationEnd */);
}
- void animateCharge(boolean isDozing) {
+ void animateCharge(DozeStateGetter dozeStateGetter) {
if (mTextAnimator == null || mTextAnimator.isRunning()) {
// Skip charge animation if dozing animation is already playing.
return;
}
Runnable startAnimPhase2 = () -> setTextStyle(
- isDozing ? mDozingWeight : mLockScreenWeight/* weight */,
+ dozeStateGetter.isDozing() ? mDozingWeight : mLockScreenWeight/* weight */,
-1,
null,
true /* animate */,
CHARGE_ANIM_DURATION_PHASE_1,
0 /* delay */,
null /* onAnimationEnd */);
- setTextStyle(isDozing ? mLockScreenWeight : mDozingWeight/* weight */,
+ setTextStyle(dozeStateGetter.isDozing() ? mLockScreenWeight : mDozingWeight/* weight */,
-1,
null,
true /* animate */,
@@ -279,4 +279,8 @@
context.getResources().getConfiguration().locale);
return dtpg.getBestPattern(skeleton);
}
+
+ interface DozeStateGetter {
+ boolean isDozing();
+ }
}
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java
index 4827cab..fde8213 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java
@@ -173,7 +173,7 @@
@Override
public void onSwipeUp() {
if (!mUpdateMonitor.isFaceDetectionRunning()) {
- mUpdateMonitor.requestFaceAuth();
+ mUpdateMonitor.requestFaceAuth(true);
mKeyguardSecurityCallback.userActivity();
showMessage(null, null);
}
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
index e2e221b..bd000b2 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
@@ -315,6 +315,7 @@
private RingerModeTracker mRingerModeTracker;
private int mFingerprintRunningState = BIOMETRIC_STATE_STOPPED;
private int mFaceRunningState = BIOMETRIC_STATE_STOPPED;
+ private boolean mIsFaceAuthUserRequested;
private LockPatternUtils mLockPatternUtils;
private final IDreamManager mDreamManager;
private boolean mIsDreaming;
@@ -1369,7 +1370,7 @@
Trace.endSection();
// on auth success, we sometimes never received an acquired haptic
- if (!mPlayedAcquiredHaptic) {
+ if (!mPlayedAcquiredHaptic && isUdfpsEnrolled()) {
playAcquiredHaptic();
}
}
@@ -1387,7 +1388,9 @@
@Override
public void onAuthenticationAcquired(int acquireInfo) {
handleFingerprintAcquired(acquireInfo);
- if (acquireInfo == FingerprintManager.FINGERPRINT_ACQUIRED_GOOD) {
+ if (acquireInfo == FingerprintManager.FINGERPRINT_ACQUIRED_GOOD
+ && isUdfpsEnrolled()) {
+ mPlayedAcquiredHaptic = true;
playAcquiredHaptic();
}
}
@@ -1402,20 +1405,23 @@
public void onUdfpsPointerUp(int sensorId) {
Log.d(TAG, "onUdfpsPointerUp, sensorId: " + sensorId);
}
-
- private void playAcquiredHaptic() {
- if (mAcquiredHapticEnabled && mVibrator != null && isUdfpsEnrolled()) {
- mPlayedAcquiredHaptic = true;
- String effect = Settings.Global.getString(
- mContext.getContentResolver(),
- "udfps_acquired_type");
- mVibrator.vibrate(UdfpsController.getVibration(effect,
- UdfpsController.EFFECT_TICK),
- UdfpsController.VIBRATION_SONIFICATION_ATTRIBUTES);
- }
- }
};
+ /**
+ * Play haptic to signal udfps fingeprrint acquired.
+ */
+ @VisibleForTesting
+ public void playAcquiredHaptic() {
+ if (mAcquiredHapticEnabled && mVibrator != null) {
+ String effect = Settings.Global.getString(
+ mContext.getContentResolver(),
+ "udfps_acquired_type");
+ mVibrator.vibrate(UdfpsController.getVibration(effect,
+ UdfpsController.EFFECT_TICK),
+ UdfpsController.VIBRATION_SONIFICATION_ATTRIBUTES);
+ }
+ }
+
private final FaceManager.FaceDetectionCallback mFaceDetectionCallback
= (sensorId, userId, isStrongBiometric) -> {
// Trigger the face success path so the bouncer can be shown
@@ -2106,12 +2112,18 @@
/**
* Requests face authentication if we're on a state where it's allowed.
* This will re-trigger auth in case it fails.
+ * @param userInitiatedRequest true if the user explicitly requested face auth
*/
- public void requestFaceAuth() {
- if (DEBUG) Log.d(TAG, "requestFaceAuth()");
+ public void requestFaceAuth(boolean userInitiatedRequest) {
+ if (DEBUG) Log.d(TAG, "requestFaceAuth() userInitiated=" + userInitiatedRequest);
+ mIsFaceAuthUserRequested |= userInitiatedRequest;
updateFaceListeningState();
}
+ public boolean isFaceAuthUserRequested() {
+ return mIsFaceAuthUserRequested;
+ }
+
/**
* In case face auth is running, cancel it.
*/
@@ -2128,6 +2140,7 @@
mHandler.removeCallbacks(mRetryFaceAuthentication);
boolean shouldListenForFace = shouldListenForFace();
if (mFaceRunningState == BIOMETRIC_STATE_RUNNING && !shouldListenForFace) {
+ mIsFaceAuthUserRequested = false;
stopListeningForFace();
} else if (mFaceRunningState != BIOMETRIC_STATE_RUNNING && shouldListenForFace) {
startListeningForFace();
diff --git a/packages/SystemUI/src/com/android/systemui/backup/BackupHelper.kt b/packages/SystemUI/src/com/android/systemui/backup/BackupHelper.kt
index fe31a7b..c9e6771 100644
--- a/packages/SystemUI/src/com/android/systemui/backup/BackupHelper.kt
+++ b/packages/SystemUI/src/com/android/systemui/backup/BackupHelper.kt
@@ -29,6 +29,7 @@
import android.util.Log
import com.android.systemui.controls.controller.AuxiliaryPersistenceWrapper
import com.android.systemui.controls.controller.ControlsFavoritePersistenceWrapper
+import com.android.systemui.people.widget.PeopleBackupHelper
/**
* Helper for backing up elements in SystemUI
@@ -45,18 +46,29 @@
private const val TAG = "BackupHelper"
internal const val CONTROLS = ControlsFavoritePersistenceWrapper.FILE_NAME
private const val NO_OVERWRITE_FILES_BACKUP_KEY = "systemui.files_no_overwrite"
+ private const val PEOPLE_TILES_BACKUP_KEY = "systemui.people.shared_preferences"
val controlsDataLock = Any()
const val ACTION_RESTORE_FINISHED = "com.android.systemui.backup.RESTORE_FINISHED"
private const val PERMISSION_SELF = "com.android.systemui.permission.SELF"
}
- override fun onCreate() {
+ override fun onCreate(userHandle: UserHandle, operationType: Int) {
super.onCreate()
// The map in mapOf is guaranteed to be order preserving
val controlsMap = mapOf(CONTROLS to getPPControlsFile(this))
NoOverwriteFileBackupHelper(controlsDataLock, this, controlsMap).also {
addHelper(NO_OVERWRITE_FILES_BACKUP_KEY, it)
}
+
+ // Conversations widgets backup only works for system user, because widgets' information is
+ // stored in system user's SharedPreferences files and we can't open those from other users.
+ if (!userHandle.isSystem) {
+ return
+ }
+
+ val keys = PeopleBackupHelper.getFilesToBackup()
+ addHelper(PEOPLE_TILES_BACKUP_KEY, PeopleBackupHelper(
+ this, userHandle, keys.toTypedArray()))
}
override fun onRestoreFinished() {
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java
index 3d2c4e1..2d04d8d 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java
@@ -430,21 +430,7 @@
mTouchLogTime = SystemClock.elapsedRealtime();
mPowerManager.userActivity(SystemClock.uptimeMillis(),
PowerManager.USER_ACTIVITY_EVENT_TOUCH, 0);
-
- // TODO: this should eventually be removed after ux testing
- if (mVibrator != null) {
- final ContentResolver contentResolver =
- mContext.getContentResolver();
- int startEnabled = Settings.Global.getInt(contentResolver,
- "udfps_start", 1);
- if (startEnabled > 0) {
- String startEffectSetting = Settings.Global.getString(
- contentResolver, "udfps_start_type");
- mVibrator.vibrate(getVibration(startEffectSetting,
- EFFECT_CLICK), VIBRATION_SONIFICATION_ATTRIBUTES);
- }
- }
-
+ playStartHaptic();
handled = true;
} else if (sinceLastLog >= MIN_TOUCH_LOG_INTERVAL) {
Log.v(TAG, "onTouch | finger move: " + touchInfo);
@@ -498,6 +484,7 @@
@NonNull LockscreenShadeTransitionController lockscreenShadeTransitionController,
@NonNull ScreenLifecycle screenLifecycle,
@Nullable Vibrator vibrator,
+ @NonNull UdfpsHapticsSimulator udfpsHapticsSimulator,
@NonNull Optional<UdfpsHbmProvider> hbmProvider) {
mContext = context;
mExecution = execution;
@@ -544,6 +531,29 @@
final IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
context.registerReceiver(mBroadcastReceiver, filter);
+
+ udfpsHapticsSimulator.setUdfpsController(this);
+ }
+
+ /**
+ * Play haptic to signal udfps scanning started.
+ */
+ @VisibleForTesting
+ public void playStartHaptic() {
+ if (mVibrator != null) {
+ final ContentResolver contentResolver =
+ mContext.getContentResolver();
+ // TODO: these settings checks should eventually be removed after ux testing
+ // (b/185124905)
+ int startEnabled = Settings.Global.getInt(contentResolver,
+ "udfps_start", 1);
+ if (startEnabled > 0) {
+ String startEffectSetting = Settings.Global.getString(
+ contentResolver, "udfps_start_type");
+ mVibrator.vibrate(getVibration(startEffectSetting,
+ EFFECT_CLICK), VIBRATION_SONIFICATION_ATTRIBUTES);
+ }
+ }
}
private int getCoreLayoutParamFlags() {
@@ -836,7 +846,6 @@
}
}
-
/**
* get vibration to play given string
* used for testing purposes (b/185124905)
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsHapticsSimulator.kt b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsHapticsSimulator.kt
new file mode 100644
index 0000000..ea2bbfa
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsHapticsSimulator.kt
@@ -0,0 +1,94 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.biometrics
+
+import android.media.AudioAttributes
+import android.os.VibrationEffect
+import android.os.Vibrator
+
+import com.android.keyguard.KeyguardUpdateMonitor
+
+import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.statusbar.commandline.Command
+import com.android.systemui.statusbar.commandline.CommandRegistry
+
+import java.io.PrintWriter
+
+import javax.inject.Inject
+
+/**
+ * Used to simulate haptics that may be used for udfps authentication.
+ */
+@SysUISingleton
+class UdfpsHapticsSimulator @Inject constructor(
+ commandRegistry: CommandRegistry,
+ val vibrator: Vibrator?,
+ val keyguardUpdateMonitor: KeyguardUpdateMonitor
+) : Command {
+ val sonificationEffects =
+ AudioAttributes.Builder()
+ .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
+ .setUsage(AudioAttributes.USAGE_ASSISTANCE_SONIFICATION)
+ .build()
+ var udfpsController: UdfpsController? = null
+
+ init {
+ commandRegistry.registerCommand("udfps-haptic") { this }
+ }
+
+ override fun execute(pw: PrintWriter, args: List<String>) {
+ if (args.isEmpty()) {
+ invalidCommand(pw)
+ } else {
+ when (args[0]) {
+ "start" -> {
+ udfpsController?.playStartHaptic()
+ }
+ "acquired" -> {
+ keyguardUpdateMonitor.playAcquiredHaptic()
+ }
+ "success" -> {
+ // needs to be kept up to date with AcquisitionClient#SUCCESS_VIBRATION_EFFECT
+ vibrator?.vibrate(
+ VibrationEffect.get(VibrationEffect.EFFECT_CLICK),
+ sonificationEffects)
+ }
+ "error" -> {
+ // needs to be kept up to date with AcquisitionClient#ERROR_VIBRATION_EFFECT
+ vibrator?.vibrate(
+ VibrationEffect.get(VibrationEffect.EFFECT_DOUBLE_CLICK),
+ sonificationEffects)
+ }
+ else -> invalidCommand(pw)
+ }
+ }
+ }
+
+ override fun help(pw: PrintWriter) {
+ pw.println("Usage: adb shell cmd statusbar udfps-haptic <haptic>")
+ pw.println("Available commands:")
+ pw.println(" start")
+ pw.println(" acquired")
+ pw.println(" success, always plays CLICK haptic")
+ pw.println(" error, always plays DOUBLE_CLICK haptic")
+ }
+
+ fun invalidCommand(pw: PrintWriter) {
+ pw.println("invalid command")
+ help(pw)
+ }
+}
\ No newline at end of file
diff --git a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsImpl.java b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsImpl.java
index e37d3d5..a641ad4 100644
--- a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsImpl.java
@@ -30,7 +30,6 @@
import android.widget.TextView;
import com.android.internal.R;
-import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.settingslib.Utils;
import com.android.systemui.plugins.GlobalActions;
import com.android.systemui.scrim.ScrimDrawable;
@@ -51,7 +50,6 @@
private final KeyguardStateController mKeyguardStateController;
private final DeviceProvisionedController mDeviceProvisionedController;
private final BlurUtils mBlurUtils;
- private final KeyguardUpdateMonitor mKeyguardUpdateMonitor;
private final CommandQueue mCommandQueue;
private GlobalActionsDialogLite mGlobalActionsDialog;
private boolean mDisabled;
@@ -60,15 +58,13 @@
public GlobalActionsImpl(Context context, CommandQueue commandQueue,
Lazy<GlobalActionsDialogLite> globalActionsDialogLazy, BlurUtils blurUtils,
KeyguardStateController keyguardStateController,
- DeviceProvisionedController deviceProvisionedController,
- KeyguardUpdateMonitor keyguardUpdateMonitor) {
+ DeviceProvisionedController deviceProvisionedController) {
mContext = context;
mGlobalActionsDialogLazy = globalActionsDialogLazy;
mKeyguardStateController = keyguardStateController;
mDeviceProvisionedController = deviceProvisionedController;
mCommandQueue = commandQueue;
mBlurUtils = blurUtils;
- mKeyguardUpdateMonitor = keyguardUpdateMonitor;
mCommandQueue.addCallback(this);
}
@@ -87,7 +83,6 @@
mGlobalActionsDialog = mGlobalActionsDialogLazy.get();
mGlobalActionsDialog.showOrHideDialog(mKeyguardStateController.isShowing(),
mDeviceProvisionedController.isDeviceProvisioned());
- mKeyguardUpdateMonitor.requestFaceAuth();
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardIndication.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardIndication.java
index 2873cd3..9b83b75 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardIndication.java
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardIndication.java
@@ -40,18 +40,22 @@
private final View.OnClickListener mOnClickListener;
@Nullable
private final Drawable mBackground;
+ @Nullable
+ private final Long mMinVisibilityMillis; // in milliseconds
private KeyguardIndication(
CharSequence message,
ColorStateList textColor,
Drawable icon,
View.OnClickListener onClickListener,
- Drawable background) {
+ Drawable background,
+ Long minVisibilityMillis) {
mMessage = message;
mTextColor = textColor;
mIcon = icon;
mOnClickListener = onClickListener;
mBackground = background;
+ mMinVisibilityMillis = minVisibilityMillis;
}
/**
@@ -89,6 +93,14 @@
return mBackground;
}
+ /**
+ * Minimum time to show text in milliseconds.
+ * @return null if unspecified
+ */
+ public @Nullable Long getMinVisibilityMillis() {
+ return mMinVisibilityMillis;
+ }
+
@Override
public String toString() {
String str = "KeyguardIndication{";
@@ -96,6 +108,7 @@
if (mIcon != null) str += " mIcon=" + mIcon;
if (mOnClickListener != null) str += " mOnClickListener=" + mOnClickListener;
if (mBackground != null) str += " mBackground=" + mBackground;
+ if (mMinVisibilityMillis != null) str += " mMinVisibilityMillis=" + mMinVisibilityMillis;
str += "}";
return str;
}
@@ -109,6 +122,7 @@
private View.OnClickListener mOnClickListener;
private ColorStateList mTextColor;
private Drawable mBackground;
+ private Long mMinVisibilityMillis;
public Builder() { }
@@ -155,6 +169,15 @@
}
/**
+ * Optional. Set a required minimum visibility time in milliseconds for the text
+ * to show.
+ */
+ public Builder setMinVisibilityMillis(Long minVisibilityMillis) {
+ this.mMinVisibilityMillis = minVisibilityMillis;
+ return this;
+ }
+
+ /**
* Build the KeyguardIndication.
*/
public KeyguardIndication build() {
@@ -166,7 +189,8 @@
}
return new KeyguardIndication(
- mMessage, mTextColor, mIcon, mOnClickListener, mBackground);
+ mMessage, mTextColor, mIcon, mOnClickListener, mBackground,
+ mMinVisibilityMillis);
}
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardIndicationRotateTextViewController.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardIndicationRotateTextViewController.java
index fc5f3b8..df9977f 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardIndicationRotateTextViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardIndicationRotateTextViewController.java
@@ -167,12 +167,14 @@
* - can be presented with an "error" color if isError is true
*/
public void showTransient(CharSequence newIndication, boolean isError) {
+ final long inAnimationDuration = 600L; // see KeyguardIndicationTextView.getYInDuration
updateIndication(INDICATION_TYPE_TRANSIENT,
new KeyguardIndication.Builder()
.setMessage(newIndication)
.setTextColor(isError
? Utils.getColorError(getContext())
: mInitialTextColorState)
+ .setMinVisibilityMillis(2000L + inAnimationDuration)
.build(),
/* showImmediately */true);
}
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
index c6fd20e..b5fd739 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
@@ -2161,6 +2161,15 @@
if (!mHiding
&& !mSurfaceBehindRemoteAnimationRequested
&& !mKeyguardStateController.isFlingingToDismissKeyguardDuringSwipeGesture()) {
+ if (finishedCallback != null) {
+ // There will not execute animation, send a finish callback to ensure the remote
+ // animation won't hanging there.
+ try {
+ finishedCallback.onAnimationFinished();
+ } catch (RemoteException e) {
+ Slog.w(TAG, "Failed to call onAnimationFinished", e);
+ }
+ }
setShowingLocked(mShowing, true /* force */);
return;
}
@@ -2178,12 +2187,6 @@
mDrawnCallback = null;
}
- // only play "unlock" noises if not on a call (since the incall UI
- // disables the keyguard)
- if (TelephonyManager.EXTRA_STATE_IDLE.equals(mPhoneState)) {
- playSounds(false);
- }
-
LatencyTracker.getInstance(mContext)
.onActionEnd(LatencyTracker.ACTION_LOCKSCREEN_UNLOCK);
@@ -2301,6 +2304,13 @@
}
private void onKeyguardExitFinished() {
+ // only play "unlock" noises if not on a call (since the incall UI
+ // disables the keyguard)
+ if (TelephonyManager.EXTRA_STATE_IDLE.equals(mPhoneState)) {
+ Log.i("TEST", "playSounds: false");
+ playSounds(false);
+ }
+
setShowingLocked(false);
mWakeAndUnlocking = false;
mDismissCallbackRegistry.notifyDismissSucceeded();
diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java b/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java
index 19a67e9..a3d7a81 100644
--- a/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java
+++ b/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java
@@ -347,10 +347,11 @@
artistText.setText(data.getArtist());
// Transfer chip
- mPlayerViewHolder.getSeamless().setVisibility(View.VISIBLE);
+ ViewGroup seamlessView = mPlayerViewHolder.getSeamless();
+ seamlessView.setVisibility(View.VISIBLE);
setVisibleAndAlpha(collapsedSet, R.id.media_seamless, true /*visible */);
setVisibleAndAlpha(expandedSet, R.id.media_seamless, true /*visible */);
- mPlayerViewHolder.getSeamless().setOnClickListener(v -> {
+ seamlessView.setOnClickListener(v -> {
mMediaOutputDialogFactory.create(data.getPackageName(), true);
});
@@ -374,9 +375,9 @@
collapsedSet.setAlpha(seamlessId, seamlessAlpha);
// Disable clicking on output switcher for resumption controls.
mPlayerViewHolder.getSeamless().setEnabled(!data.getResumption());
+ String deviceString = null;
if (showFallback) {
iconView.setImageDrawable(null);
- deviceName.setText(null);
} else if (device != null) {
Drawable icon = device.getIcon();
iconView.setVisibility(View.VISIBLE);
@@ -387,13 +388,16 @@
} else {
iconView.setImageDrawable(icon);
}
- deviceName.setText(device.getName());
+ deviceString = device.getName();
} else {
// Reset to default
Log.w(TAG, "device is null. Not binding output chip.");
iconView.setVisibility(View.GONE);
- deviceName.setText(com.android.internal.R.string.ext_media_seamless_action);
+ deviceString = mContext.getString(
+ com.android.internal.R.string.ext_media_seamless_action);
}
+ deviceName.setText(deviceString);
+ seamlessView.setContentDescription(deviceString);
List<Integer> actionsWhenCollapsed = data.getActionsToShowInCompact();
// Media controls
diff --git a/packages/SystemUI/src/com/android/systemui/people/PeopleBackupFollowUpJob.java b/packages/SystemUI/src/com/android/systemui/people/PeopleBackupFollowUpJob.java
new file mode 100644
index 0000000..452484f
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/people/PeopleBackupFollowUpJob.java
@@ -0,0 +1,229 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.people;
+
+import static com.android.systemui.people.PeopleSpaceUtils.DEBUG;
+import static com.android.systemui.people.PeopleSpaceUtils.EMPTY_STRING;
+import static com.android.systemui.people.PeopleSpaceUtils.removeSharedPreferencesStorageForTile;
+import static com.android.systemui.people.widget.PeopleBackupHelper.isReadyForRestore;
+
+import android.app.job.JobInfo;
+import android.app.job.JobParameters;
+import android.app.job.JobScheduler;
+import android.app.job.JobService;
+import android.app.people.IPeopleManager;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.content.pm.PackageManager;
+import android.os.PersistableBundle;
+import android.os.ServiceManager;
+import android.preference.PreferenceManager;
+import android.util.Log;
+
+import androidx.annotation.VisibleForTesting;
+
+import com.android.systemui.people.widget.PeopleBackupHelper;
+import com.android.systemui.people.widget.PeopleTileKey;
+
+import java.time.Duration;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Follow-up job that runs after a Conversations widgets restore operation. Check if shortcuts that
+ * were not available before are now available. If any shortcut doesn't become available after
+ * 1 day, we clean up its storage.
+ */
+public class PeopleBackupFollowUpJob extends JobService {
+ private static final String TAG = "PeopleBackupFollowUpJob";
+ private static final String START_DATE = "start_date";
+
+ /** Follow-up job id. */
+ public static final int JOB_ID = 74823873;
+
+ private static final long JOB_PERIODIC_DURATION = Duration.ofHours(6).toMillis();
+ private static final long CLEAN_UP_STORAGE_AFTER_DURATION = Duration.ofHours(24).toMillis();
+
+ /** SharedPreferences file name for follow-up specific storage.*/
+ public static final String SHARED_FOLLOW_UP = "shared_follow_up";
+
+ private final Object mLock = new Object();
+ private Context mContext;
+ private PackageManager mPackageManager;
+ private IPeopleManager mIPeopleManager;
+ private JobScheduler mJobScheduler;
+
+ /** Schedules a PeopleBackupFollowUpJob every 2 hours. */
+ public static void scheduleJob(Context context) {
+ JobScheduler jobScheduler = context.getSystemService(JobScheduler.class);
+ PersistableBundle bundle = new PersistableBundle();
+ bundle.putLong(START_DATE, System.currentTimeMillis());
+ JobInfo jobInfo = new JobInfo
+ .Builder(JOB_ID, new ComponentName(context, PeopleBackupFollowUpJob.class))
+ .setPeriodic(JOB_PERIODIC_DURATION)
+ .setExtras(bundle)
+ .build();
+ jobScheduler.schedule(jobInfo);
+ }
+
+ @Override
+ public void onCreate() {
+ super.onCreate();
+ mContext = getApplicationContext();
+ mPackageManager = getApplicationContext().getPackageManager();
+ mIPeopleManager = IPeopleManager.Stub.asInterface(
+ ServiceManager.getService(Context.PEOPLE_SERVICE));
+ mJobScheduler = mContext.getSystemService(JobScheduler.class);
+
+ }
+
+ /** Sets necessary managers for testing. */
+ @VisibleForTesting
+ public void setManagers(Context context, PackageManager packageManager,
+ IPeopleManager iPeopleManager, JobScheduler jobScheduler) {
+ mContext = context;
+ mPackageManager = packageManager;
+ mIPeopleManager = iPeopleManager;
+ mJobScheduler = jobScheduler;
+ }
+
+ @Override
+ public boolean onStartJob(JobParameters params) {
+ if (DEBUG) Log.d(TAG, "Starting job.");
+ synchronized (mLock) {
+ SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
+ SharedPreferences.Editor editor = sp.edit();
+ SharedPreferences followUp = this.getSharedPreferences(
+ SHARED_FOLLOW_UP, Context.MODE_PRIVATE);
+ SharedPreferences.Editor followUpEditor = followUp.edit();
+
+ // Remove from SHARED_FOLLOW_UP storage all widgets that are now ready to be updated.
+ Map<String, Set<String>> remainingWidgets =
+ processFollowUpFile(followUp, followUpEditor);
+
+ // Check if all widgets were restored or if enough time elapsed to cancel the job.
+ long start = params.getExtras().getLong(START_DATE);
+ long now = System.currentTimeMillis();
+ if (shouldCancelJob(remainingWidgets, start, now)) {
+ cancelJobAndClearRemainingWidgets(remainingWidgets, followUpEditor, sp);
+ }
+
+ editor.apply();
+ followUpEditor.apply();
+ }
+
+ // Ensure all widgets modified from SHARED_FOLLOW_UP storage are now updated.
+ PeopleBackupHelper.updateWidgets(mContext);
+ return false;
+ }
+
+ /**
+ * Iterates through follow-up file entries and checks which shortcuts are now available.
+ * Returns a map of shortcuts that should be checked at a later time.
+ */
+ public Map<String, Set<String>> processFollowUpFile(SharedPreferences followUp,
+ SharedPreferences.Editor followUpEditor) {
+ Map<String, Set<String>> remainingWidgets = new HashMap<>();
+ Map<String, ?> all = followUp.getAll();
+ for (Map.Entry<String, ?> entry : all.entrySet()) {
+ String key = entry.getKey();
+
+ PeopleTileKey peopleTileKey = PeopleTileKey.fromString(key);
+ boolean restored = isReadyForRestore(mIPeopleManager, mPackageManager, peopleTileKey);
+ if (restored) {
+ if (DEBUG) Log.d(TAG, "Removing key from follow-up: " + key);
+ followUpEditor.remove(key);
+ continue;
+ }
+
+ if (DEBUG) Log.d(TAG, "Key should not be restored yet, try later: " + key);
+ try {
+ remainingWidgets.put(entry.getKey(), (Set<String>) entry.getValue());
+ } catch (Exception e) {
+ Log.e(TAG, "Malformed entry value: " + entry.getValue());
+ }
+ }
+ return remainingWidgets;
+ }
+
+ /** Returns whether all shortcuts were restored or if enough time elapsed to cancel the job. */
+ public boolean shouldCancelJob(Map<String, Set<String>> remainingWidgets,
+ long start, long now) {
+ if (remainingWidgets.isEmpty()) {
+ if (DEBUG) Log.d(TAG, "All widget storage was successfully restored.");
+ return true;
+ }
+
+ boolean oneDayHasPassed = (now - start) > CLEAN_UP_STORAGE_AFTER_DURATION;
+ if (oneDayHasPassed) {
+ if (DEBUG) {
+ Log.w(TAG, "One or more widgets were not properly restored, "
+ + "but cancelling job because it has been a day.");
+ }
+ return true;
+ }
+ if (DEBUG) Log.d(TAG, "There are still non-restored widgets, run job again.");
+ return false;
+ }
+
+ /** Cancels job and removes storage of any shortcut that was not restored. */
+ public void cancelJobAndClearRemainingWidgets(Map<String, Set<String>> remainingWidgets,
+ SharedPreferences.Editor followUpEditor, SharedPreferences sp) {
+ if (DEBUG) Log.d(TAG, "Cancelling follow up job.");
+ removeUnavailableShortcutsFromSharedStorage(remainingWidgets, sp);
+ followUpEditor.clear();
+ mJobScheduler.cancel(JOB_ID);
+ }
+
+ private void removeUnavailableShortcutsFromSharedStorage(Map<String,
+ Set<String>> remainingWidgets, SharedPreferences sp) {
+ for (Map.Entry<String, Set<String>> entry : remainingWidgets.entrySet()) {
+ PeopleTileKey peopleTileKey = PeopleTileKey.fromString(entry.getKey());
+ if (!PeopleTileKey.isValid(peopleTileKey)) {
+ Log.e(TAG, "Malformed peopleTileKey in follow-up file: " + entry.getKey());
+ continue;
+ }
+ Set<String> widgetIds;
+ try {
+ widgetIds = (Set<String>) entry.getValue();
+ } catch (Exception e) {
+ Log.e(TAG, "Malformed widget ids in follow-up file: " + e);
+ continue;
+ }
+ for (String id : widgetIds) {
+ int widgetId;
+ try {
+ widgetId = Integer.parseInt(id);
+ } catch (NumberFormatException ex) {
+ Log.e(TAG, "Malformed widget id in follow-up file: " + ex);
+ continue;
+ }
+
+ String contactUriString = sp.getString(String.valueOf(widgetId), EMPTY_STRING);
+ removeSharedPreferencesStorageForTile(
+ mContext, peopleTileKey, widgetId, contactUriString);
+ }
+ }
+ }
+
+ @Override
+ public boolean onStopJob(JobParameters params) {
+ return false;
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceUtils.java b/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceUtils.java
index 917a060..dcab86b 100644
--- a/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceUtils.java
+++ b/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceUtils.java
@@ -25,6 +25,7 @@
import android.annotation.Nullable;
import android.app.Notification;
+import android.app.backup.BackupManager;
import android.app.people.ConversationChannel;
import android.app.people.IPeopleManager;
import android.app.people.PeopleSpaceTile;
@@ -89,7 +90,7 @@
/** Returns stored widgets for the conversation specified. */
public static Set<String> getStoredWidgetIds(SharedPreferences sp, PeopleTileKey key) {
- if (!key.isValid()) {
+ if (!PeopleTileKey.isValid(key)) {
return new HashSet<>();
}
return new HashSet<>(sp.getStringSet(key.toString(), new HashSet<>()));
@@ -97,19 +98,16 @@
/** Sets all relevant storage for {@code appWidgetId} association to {@code tile}. */
public static void setSharedPreferencesStorageForTile(Context context, PeopleTileKey key,
- int appWidgetId, Uri contactUri) {
- if (!key.isValid()) {
+ int appWidgetId, Uri contactUri, BackupManager backupManager) {
+ if (!PeopleTileKey.isValid(key)) {
Log.e(TAG, "Not storing for invalid key");
return;
}
// Write relevant persisted storage.
SharedPreferences widgetSp = context.getSharedPreferences(String.valueOf(appWidgetId),
Context.MODE_PRIVATE);
- SharedPreferences.Editor widgetEditor = widgetSp.edit();
- widgetEditor.putString(PeopleSpaceUtils.PACKAGE_NAME, key.getPackageName());
- widgetEditor.putString(PeopleSpaceUtils.SHORTCUT_ID, key.getShortcutId());
- widgetEditor.putInt(PeopleSpaceUtils.USER_ID, key.getUserId());
- widgetEditor.apply();
+ SharedPreferencesHelper.setPeopleTileKey(widgetSp, key);
+
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
SharedPreferences.Editor editor = sp.edit();
String contactUriString = contactUri == null ? EMPTY_STRING : contactUri.toString();
@@ -117,14 +115,18 @@
// Don't overwrite existing widgets with the same key.
addAppWidgetIdForKey(sp, editor, appWidgetId, key.toString());
- addAppWidgetIdForKey(sp, editor, appWidgetId, contactUriString);
+ if (!TextUtils.isEmpty(contactUriString)) {
+ addAppWidgetIdForKey(sp, editor, appWidgetId, contactUriString);
+ }
editor.apply();
+ backupManager.dataChanged();
}
/** Removes stored data when tile is deleted. */
public static void removeSharedPreferencesStorageForTile(Context context, PeopleTileKey key,
int widgetId, String contactUriString) {
// Delete widgetId mapping to key.
+ if (DEBUG) Log.d(TAG, "Removing widget info from sharedPrefs");
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
SharedPreferences.Editor editor = sp.edit();
editor.remove(String.valueOf(widgetId));
@@ -230,7 +232,7 @@
*/
public static PeopleSpaceTile augmentTileFromNotification(Context context, PeopleSpaceTile tile,
PeopleTileKey key, NotificationEntry notificationEntry, int messagesCount,
- Optional<Integer> appWidgetId) {
+ Optional<Integer> appWidgetId, BackupManager backupManager) {
if (notificationEntry == null || notificationEntry.getSbn().getNotification() == null) {
if (DEBUG) Log.d(TAG, "Tile key: " + key.toString() + ". Notification is null");
return removeNotificationFields(tile);
@@ -246,7 +248,7 @@
Uri contactUri = Uri.parse(uriFromNotification);
// Update storage.
setSharedPreferencesStorageForTile(context, new PeopleTileKey(tile), appWidgetId.get(),
- contactUri);
+ contactUri, backupManager);
// Update cached tile in-memory.
updatedTile.setContactUri(contactUri);
}
diff --git a/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java b/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java
index 844a8c6..730e850 100644
--- a/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java
@@ -330,11 +330,8 @@
R.layout.people_tile_suppressed_layout);
}
Drawable appIcon = mContext.getDrawable(R.drawable.ic_conversation_icon);
- Bitmap appIconAsBitmap = convertDrawableToBitmap(appIcon);
- FastBitmapDrawable drawable = new FastBitmapDrawable(appIconAsBitmap);
- drawable.setIsDisabled(true);
- Bitmap convertedBitmap = convertDrawableToBitmap(drawable);
- views.setImageViewBitmap(R.id.icon, convertedBitmap);
+ Bitmap disabledBitmap = convertDrawableToDisabledBitmap(appIcon);
+ views.setImageViewBitmap(R.id.icon, disabledBitmap);
return views;
}
@@ -504,6 +501,11 @@
}
private RemoteViews setLaunchIntents(RemoteViews views) {
+ if (!PeopleTileKey.isValid(mKey) || mTile == null) {
+ if (DEBUG) Log.d(TAG, "Skipping launch intent, Null tile or invalid key: " + mKey);
+ return views;
+ }
+
try {
Intent activityIntent = new Intent(mContext, LaunchConversationActivity.class);
activityIntent.addFlags(
@@ -1067,7 +1069,8 @@
Icon icon = tile.getUserIcon();
if (icon == null) {
- return null;
+ Drawable placeholder = context.getDrawable(R.drawable.ic_avatar_with_badge);
+ return convertDrawableToDisabledBitmap(placeholder);
}
PeopleStoryIconFactory storyIcon = new PeopleStoryIconFactory(context,
context.getPackageManager(),
@@ -1179,4 +1182,11 @@
mAvatarSize = avatarSize;
}
}
+
+ private static Bitmap convertDrawableToDisabledBitmap(Drawable icon) {
+ Bitmap appIconAsBitmap = convertDrawableToBitmap(icon);
+ FastBitmapDrawable drawable = new FastBitmapDrawable(appIconAsBitmap);
+ drawable.setIsDisabled(true);
+ return convertDrawableToBitmap(drawable);
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/people/SharedPreferencesHelper.java b/packages/SystemUI/src/com/android/systemui/people/SharedPreferencesHelper.java
new file mode 100644
index 0000000..aef08fb
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/people/SharedPreferencesHelper.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.people;
+
+import static com.android.systemui.people.PeopleSpaceUtils.INVALID_USER_ID;
+import static com.android.systemui.people.PeopleSpaceUtils.PACKAGE_NAME;
+import static com.android.systemui.people.PeopleSpaceUtils.SHORTCUT_ID;
+import static com.android.systemui.people.PeopleSpaceUtils.USER_ID;
+
+import android.content.SharedPreferences;
+
+import com.android.systemui.people.widget.PeopleTileKey;
+
+/** Helper class for Conversations widgets SharedPreferences storage. */
+public class SharedPreferencesHelper {
+ /** Clears all storage from {@code sp}. */
+ public static void clear(SharedPreferences sp) {
+ SharedPreferences.Editor editor = sp.edit();
+ editor.clear();
+ editor.apply();
+ }
+
+ /** Sets {@code sp}'s storage to identify a {@link PeopleTileKey}. */
+ public static void setPeopleTileKey(SharedPreferences sp, PeopleTileKey key) {
+ setPeopleTileKey(sp, key.getShortcutId(), key.getUserId(), key.getPackageName());
+ }
+
+ /** Sets {@code sp}'s storage to identify a {@link PeopleTileKey}. */
+ public static void setPeopleTileKey(SharedPreferences sp, String shortcutId, int userId,
+ String packageName) {
+ SharedPreferences.Editor editor = sp.edit();
+ editor.putString(SHORTCUT_ID, shortcutId);
+ editor.putInt(USER_ID, userId);
+ editor.putString(PACKAGE_NAME, packageName);
+ editor.apply();
+ }
+
+ /** Returns a {@link PeopleTileKey} based on storage from {@code sp}. */
+ public static PeopleTileKey getPeopleTileKey(SharedPreferences sp) {
+ String shortcutId = sp.getString(SHORTCUT_ID, null);
+ String packageName = sp.getString(PACKAGE_NAME, null);
+ int userId = sp.getInt(USER_ID, INVALID_USER_ID);
+ return new PeopleTileKey(shortcutId, userId, packageName);
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/people/widget/LaunchConversationActivity.java b/packages/SystemUI/src/com/android/systemui/people/widget/LaunchConversationActivity.java
index b031637..79318d6 100644
--- a/packages/SystemUI/src/com/android/systemui/people/widget/LaunchConversationActivity.java
+++ b/packages/SystemUI/src/com/android/systemui/people/widget/LaunchConversationActivity.java
@@ -152,7 +152,7 @@
launcherApps.startShortcut(
packageName, tileId, null, null, userHandle);
} catch (Exception e) {
- Log.e(TAG, "Exception:" + e);
+ Log.e(TAG, "Exception launching shortcut:" + e);
}
} else {
if (DEBUG) Log.d(TAG, "Trying to launch conversation with null shortcutInfo.");
diff --git a/packages/SystemUI/src/com/android/systemui/people/widget/PeopleBackupHelper.java b/packages/SystemUI/src/com/android/systemui/people/widget/PeopleBackupHelper.java
new file mode 100644
index 0000000..d8c96dd
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/people/widget/PeopleBackupHelper.java
@@ -0,0 +1,508 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.people.widget;
+
+import static com.android.systemui.people.PeopleBackupFollowUpJob.SHARED_FOLLOW_UP;
+import static com.android.systemui.people.PeopleSpaceUtils.DEBUG;
+import static com.android.systemui.people.PeopleSpaceUtils.INVALID_USER_ID;
+import static com.android.systemui.people.PeopleSpaceUtils.USER_ID;
+
+import android.app.backup.BackupDataInputStream;
+import android.app.backup.BackupDataOutput;
+import android.app.backup.SharedPreferencesBackupHelper;
+import android.app.people.IPeopleManager;
+import android.appwidget.AppWidgetManager;
+import android.content.ComponentName;
+import android.content.ContentProvider;
+import android.content.Context;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.net.Uri;
+import android.os.ParcelFileDescriptor;
+import android.os.ServiceManager;
+import android.os.UserHandle;
+import android.preference.PreferenceManager;
+import android.text.TextUtils;
+import android.util.Log;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.systemui.people.PeopleBackupFollowUpJob;
+import com.android.systemui.people.SharedPreferencesHelper;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+/**
+ * Helper class to backup and restore Conversations widgets storage.
+ * It is used by SystemUI's BackupHelper agent.
+ * TODO(b/192334798): Lock access to storage using PeopleSpaceWidgetManager's lock.
+ */
+public class PeopleBackupHelper extends SharedPreferencesBackupHelper {
+ private static final String TAG = "PeopleBackupHelper";
+
+ public static final String ADD_USER_ID_TO_URI = "add_user_id_to_uri_";
+ public static final String SHARED_BACKUP = "shared_backup";
+
+ private final Context mContext;
+ private final UserHandle mUserHandle;
+ private final PackageManager mPackageManager;
+ private final IPeopleManager mIPeopleManager;
+ private final AppWidgetManager mAppWidgetManager;
+
+ /**
+ * Types of entries stored in the default SharedPreferences file for Conversation widgets.
+ * Widget ID corresponds to a pair [widgetId, contactURI].
+ * PeopleTileKey corresponds to a pair [PeopleTileKey, {widgetIds}].
+ * Contact URI corresponds to a pair [Contact URI, {widgetIds}].
+ */
+ enum SharedFileEntryType {
+ UNKNOWN,
+ WIDGET_ID,
+ PEOPLE_TILE_KEY,
+ CONTACT_URI
+ }
+
+ /**
+ * Returns the file names that should be backed up and restored by SharedPreferencesBackupHelper
+ * infrastructure.
+ */
+ public static List<String> getFilesToBackup() {
+ return Collections.singletonList(SHARED_BACKUP);
+ }
+
+ public PeopleBackupHelper(Context context, UserHandle userHandle,
+ String[] sharedPreferencesKey) {
+ super(context, sharedPreferencesKey);
+ mContext = context;
+ mUserHandle = userHandle;
+ mPackageManager = context.getPackageManager();
+ mIPeopleManager = IPeopleManager.Stub.asInterface(
+ ServiceManager.getService(Context.PEOPLE_SERVICE));
+ mAppWidgetManager = AppWidgetManager.getInstance(context);
+ }
+
+ @VisibleForTesting
+ public PeopleBackupHelper(Context context, UserHandle userHandle,
+ String[] sharedPreferencesKey, PackageManager packageManager,
+ IPeopleManager peopleManager) {
+ super(context, sharedPreferencesKey);
+ mContext = context;
+ mUserHandle = userHandle;
+ mPackageManager = packageManager;
+ mIPeopleManager = peopleManager;
+ mAppWidgetManager = AppWidgetManager.getInstance(context);
+ }
+
+ /**
+ * Reads values from default storage, backs them up appropriately to a specified backup file,
+ * and calls super's performBackup, which backs up the values of the backup file.
+ */
+ @Override
+ public void performBackup(ParcelFileDescriptor oldState, BackupDataOutput data,
+ ParcelFileDescriptor newState) {
+ if (DEBUG) Log.d(TAG, "Backing up conversation widgets, writing to: " + SHARED_BACKUP);
+ // Open default value for readings values.
+ SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(mContext);
+ if (sp.getAll().isEmpty()) {
+ if (DEBUG) Log.d(TAG, "No information to be backed up, finishing.");
+ return;
+ }
+
+ // Open backup file for writing.
+ SharedPreferences backupSp = mContext.getSharedPreferences(
+ SHARED_BACKUP, Context.MODE_PRIVATE);
+ SharedPreferences.Editor backupEditor = backupSp.edit();
+ backupEditor.clear();
+
+ // Fetch Conversations widgets corresponding to this user.
+ List<String> existingWidgets = getExistingWidgetsForUser(mUserHandle.getIdentifier());
+ if (existingWidgets.isEmpty()) {
+ if (DEBUG) Log.d(TAG, "No existing Conversations widgets, returning.");
+ return;
+ }
+
+ // Writes each entry to backup file.
+ sp.getAll().entrySet().forEach(entry -> backupKey(entry, backupEditor, existingWidgets));
+ backupEditor.apply();
+
+ super.performBackup(oldState, data, newState);
+ }
+
+ /**
+ * Restores backed up values to backup file via super's restoreEntity, then transfers them
+ * back to regular storage. Restore operations for each users are done in sequence, so we can
+ * safely use the same backup file names.
+ */
+ @Override
+ public void restoreEntity(BackupDataInputStream data) {
+ if (DEBUG) Log.d(TAG, "Restoring Conversation widgets.");
+ super.restoreEntity(data);
+
+ // Open backup file for reading values.
+ SharedPreferences backupSp = mContext.getSharedPreferences(
+ SHARED_BACKUP, Context.MODE_PRIVATE);
+
+ // Open default file and follow-up file for writing.
+ SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(mContext);
+ SharedPreferences.Editor editor = sp.edit();
+ SharedPreferences followUp = mContext.getSharedPreferences(
+ SHARED_FOLLOW_UP, Context.MODE_PRIVATE);
+ SharedPreferences.Editor followUpEditor = followUp.edit();
+
+ // Writes each entry back to default value.
+ boolean shouldScheduleJob = false;
+ for (Map.Entry<String, ?> entry : backupSp.getAll().entrySet()) {
+ boolean restored = restoreKey(entry, editor, followUpEditor, backupSp);
+ if (!restored) {
+ shouldScheduleJob = true;
+ }
+ }
+
+ editor.apply();
+ followUpEditor.apply();
+ SharedPreferencesHelper.clear(backupSp);
+
+ // If any of the widgets is not yet available, schedule a follow-up job to check later.
+ if (shouldScheduleJob) {
+ if (DEBUG) Log.d(TAG, "At least one shortcut is not available, scheduling follow-up.");
+ PeopleBackupFollowUpJob.scheduleJob(mContext);
+ }
+
+ updateWidgets(mContext);
+ }
+
+ /** Backs up an entry from default file to backup file. */
+ public void backupKey(Map.Entry<String, ?> entry, SharedPreferences.Editor backupEditor,
+ List<String> existingWidgets) {
+ String key = entry.getKey();
+ if (TextUtils.isEmpty(key)) {
+ return;
+ }
+
+ SharedFileEntryType entryType = getEntryType(entry);
+ switch(entryType) {
+ case WIDGET_ID:
+ backupWidgetIdKey(key, String.valueOf(entry.getValue()), backupEditor,
+ existingWidgets);
+ break;
+ case PEOPLE_TILE_KEY:
+ backupPeopleTileKey(key, (Set<String>) entry.getValue(), backupEditor,
+ existingWidgets);
+ break;
+ case CONTACT_URI:
+ backupContactUriKey(key, (Set<String>) entry.getValue(), backupEditor);
+ break;
+ case UNKNOWN:
+ default:
+ Log.w(TAG, "Key not identified, skipping: " + key);
+ }
+ }
+
+ /**
+ * Tries to restore an entry from backup file to default file.
+ * Returns true if restore is finished, false if it needs to be checked later.
+ */
+ boolean restoreKey(Map.Entry<String, ?> entry, SharedPreferences.Editor editor,
+ SharedPreferences.Editor followUpEditor, SharedPreferences backupSp) {
+ String key = entry.getKey();
+ SharedFileEntryType keyType = getEntryType(entry);
+ int storedUserId = backupSp.getInt(ADD_USER_ID_TO_URI + key, INVALID_USER_ID);
+ switch (keyType) {
+ case WIDGET_ID:
+ restoreWidgetIdKey(key, String.valueOf(entry.getValue()), editor, storedUserId);
+ return true;
+ case PEOPLE_TILE_KEY:
+ return restorePeopleTileKeyAndCorrespondingWidgetFile(
+ key, (Set<String>) entry.getValue(), editor, followUpEditor);
+ case CONTACT_URI:
+ restoreContactUriKey(key, (Set<String>) entry.getValue(), editor, storedUserId);
+ return true;
+ case UNKNOWN:
+ default:
+ Log.e(TAG, "Key not identified, skipping:" + key);
+ return true;
+ }
+ }
+
+ /**
+ * Backs up a [widgetId, contactURI] pair, if widget id corresponds to current user.
+ * If contact URI has a user id, stores it so it can be re-added on restore.
+ */
+ private void backupWidgetIdKey(String key, String uriString, SharedPreferences.Editor editor,
+ List<String> existingWidgets) {
+ if (!existingWidgets.contains(key)) {
+ if (DEBUG) Log.d(TAG, "Widget: " + key + " does't correspond to this user, skipping.");
+ return;
+ }
+ Uri uri = Uri.parse(uriString);
+ if (ContentProvider.uriHasUserId(uri)) {
+ if (DEBUG) Log.d(TAG, "Contact URI value has user ID, removing from: " + uri);
+ int userId = ContentProvider.getUserIdFromUri(uri);
+ editor.putInt(ADD_USER_ID_TO_URI + key, userId);
+ uri = ContentProvider.getUriWithoutUserId(uri);
+ }
+ if (DEBUG) Log.d(TAG, "Backing up widgetId key: " + key + " . Value: " + uri.toString());
+ editor.putString(key, uri.toString());
+ }
+
+ /** Restores a [widgetId, contactURI] pair, and a potential {@code storedUserId}. */
+ private void restoreWidgetIdKey(String key, String uriString, SharedPreferences.Editor editor,
+ int storedUserId) {
+ Uri uri = Uri.parse(uriString);
+ if (storedUserId != INVALID_USER_ID) {
+ uri = ContentProvider.createContentUriForUser(uri, UserHandle.of(storedUserId));
+ if (DEBUG) Log.d(TAG, "UserId was removed from URI on back up, re-adding as:" + uri);
+
+ }
+ if (DEBUG) Log.d(TAG, "Restoring widgetId key: " + key + " . Value: " + uri.toString());
+ editor.putString(key, uri.toString());
+ }
+
+ /**
+ * Backs up a [PeopleTileKey, {widgetIds}] pair, if PeopleTileKey's user is the same as current
+ * user, stripping out the user id.
+ */
+ private void backupPeopleTileKey(String key, Set<String> widgetIds,
+ SharedPreferences.Editor editor, List<String> existingWidgets) {
+ PeopleTileKey peopleTileKey = PeopleTileKey.fromString(key);
+ if (peopleTileKey.getUserId() != mUserHandle.getIdentifier()) {
+ if (DEBUG) Log.d(TAG, "PeopleTileKey corresponds to different user, skipping backup.");
+ return;
+ }
+
+ Set<String> filteredWidgets = widgetIds.stream()
+ .filter(id -> existingWidgets.contains(id))
+ .collect(Collectors.toSet());
+ if (filteredWidgets.isEmpty()) {
+ return;
+ }
+
+ peopleTileKey.setUserId(INVALID_USER_ID);
+ if (DEBUG) {
+ Log.d(TAG, "Backing up PeopleTileKey key: " + peopleTileKey.toString() + ". Value: "
+ + filteredWidgets);
+ }
+ editor.putStringSet(peopleTileKey.toString(), filteredWidgets);
+ }
+
+ /**
+ * Restores a [PeopleTileKey, {widgetIds}] pair, restoring the user id. Checks if the
+ * corresponding shortcut exists, and if not, we should schedule a follow up to check later.
+ * Also restores corresponding [widgetId, PeopleTileKey], which is not backed up since the
+ * information can be inferred from this.
+ * Returns true if restore is finished, false if we should check if shortcut is available later.
+ */
+ private boolean restorePeopleTileKeyAndCorrespondingWidgetFile(String key,
+ Set<String> widgetIds, SharedPreferences.Editor editor,
+ SharedPreferences.Editor followUpEditor) {
+ PeopleTileKey peopleTileKey = PeopleTileKey.fromString(key);
+ // Should never happen, as type of key has been checked.
+ if (peopleTileKey == null) {
+ if (DEBUG) Log.d(TAG, "PeopleTileKey key to be restored is null, skipping.");
+ return true;
+ }
+
+ peopleTileKey.setUserId(mUserHandle.getIdentifier());
+ if (!PeopleTileKey.isValid(peopleTileKey)) {
+ if (DEBUG) Log.d(TAG, "PeopleTileKey key to be restored is not valid, skipping.");
+ return true;
+ }
+
+ boolean restored = isReadyForRestore(
+ mIPeopleManager, mPackageManager, peopleTileKey);
+ if (!restored) {
+ if (DEBUG) Log.d(TAG, "Adding key to follow-up storage: " + peopleTileKey.toString());
+ // Follow-up file stores shortcuts that need to be checked later, and possibly wiped
+ // from our storage.
+ followUpEditor.putStringSet(peopleTileKey.toString(), widgetIds);
+ }
+
+ if (DEBUG) {
+ Log.d(TAG, "Restoring PeopleTileKey key: " + peopleTileKey.toString() + " . Value: "
+ + widgetIds);
+ }
+ editor.putStringSet(peopleTileKey.toString(), widgetIds);
+ restoreWidgetIdFiles(mContext, widgetIds, peopleTileKey);
+ return restored;
+ }
+
+ /**
+ * Backs up a [contactURI, {widgetIds}] pair. If contactURI contains a userId, we back up
+ * this entry in the corresponding user. If it doesn't, we back it up as user 0.
+ * If contact URI has a user id, stores it so it can be re-added on restore.
+ * We do not take existing widgets for this user into consideration.
+ */
+ private void backupContactUriKey(String key, Set<String> widgetIds,
+ SharedPreferences.Editor editor) {
+ Uri uri = Uri.parse(String.valueOf(key));
+ if (ContentProvider.uriHasUserId(uri)) {
+ int userId = ContentProvider.getUserIdFromUri(uri);
+ if (DEBUG) Log.d(TAG, "Contact URI has user Id: " + userId);
+ if (userId == mUserHandle.getIdentifier()) {
+ uri = ContentProvider.getUriWithoutUserId(uri);
+ if (DEBUG) {
+ Log.d(TAG, "Backing up contactURI key: " + uri.toString() + " . Value: "
+ + widgetIds);
+ }
+ editor.putInt(ADD_USER_ID_TO_URI + uri.toString(), userId);
+ editor.putStringSet(uri.toString(), widgetIds);
+ } else {
+ if (DEBUG) Log.d(TAG, "ContactURI corresponds to different user, skipping.");
+ }
+ } else if (mUserHandle.isSystem()) {
+ if (DEBUG) {
+ Log.d(TAG, "Backing up contactURI key: " + uri.toString() + " . Value: "
+ + widgetIds);
+ }
+ editor.putStringSet(uri.toString(), widgetIds);
+ }
+ }
+
+ /** Restores a [contactURI, {widgetIds}] pair, and a potential {@code storedUserId}. */
+ private void restoreContactUriKey(String key, Set<String> widgetIds,
+ SharedPreferences.Editor editor, int storedUserId) {
+ Uri uri = Uri.parse(key);
+ if (storedUserId != INVALID_USER_ID) {
+ uri = ContentProvider.createContentUriForUser(uri, UserHandle.of(storedUserId));
+ if (DEBUG) Log.d(TAG, "UserId was removed from URI on back up, re-adding as:" + uri);
+ }
+ if (DEBUG) {
+ Log.d(TAG, "Restoring contactURI key: " + uri.toString() + " . Value: " + widgetIds);
+ }
+ editor.putStringSet(uri.toString(), widgetIds);
+ }
+
+ /** Restores the widget-specific files that contain PeopleTileKey information. */
+ public static void restoreWidgetIdFiles(Context context, Set<String> widgetIds,
+ PeopleTileKey key) {
+ for (String id : widgetIds) {
+ if (DEBUG) Log.d(TAG, "Restoring widget Id file: " + id + " . Value: " + key);
+ SharedPreferences dest = context.getSharedPreferences(id, Context.MODE_PRIVATE);
+ SharedPreferencesHelper.setPeopleTileKey(dest, key);
+ }
+ }
+
+ private List<String> getExistingWidgetsForUser(int userId) {
+ List<String> existingWidgets = new ArrayList<>();
+ int[] ids = mAppWidgetManager.getAppWidgetIds(
+ new ComponentName(mContext, PeopleSpaceWidgetProvider.class));
+ for (int id : ids) {
+ String idString = String.valueOf(id);
+ SharedPreferences sp = mContext.getSharedPreferences(idString, Context.MODE_PRIVATE);
+ if (sp.getInt(USER_ID, INVALID_USER_ID) == userId) {
+ existingWidgets.add(idString);
+ }
+ }
+ if (DEBUG) Log.d(TAG, "Existing widgets: " + existingWidgets);
+ return existingWidgets;
+ }
+
+ /**
+ * Returns whether {@code key} corresponds to a shortcut that is ready for restore, either
+ * because it is available or because it never will be. If not ready, we schedule a job to check
+ * again later.
+ */
+ public static boolean isReadyForRestore(IPeopleManager peopleManager,
+ PackageManager packageManager, PeopleTileKey key) {
+ if (DEBUG) Log.d(TAG, "Checking if we should schedule a follow up job : " + key);
+ if (!PeopleTileKey.isValid(key)) {
+ if (DEBUG) Log.d(TAG, "Key is invalid, should not follow up.");
+ return true;
+ }
+
+ try {
+ PackageInfo info = packageManager.getPackageInfoAsUser(
+ key.getPackageName(), 0, key.getUserId());
+ } catch (PackageManager.NameNotFoundException e) {
+ if (DEBUG) Log.d(TAG, "Package is not installed, should follow up.");
+ return false;
+ }
+
+ try {
+ boolean isConversation = peopleManager.isConversation(
+ key.getPackageName(), key.getUserId(), key.getShortcutId());
+ if (DEBUG) {
+ Log.d(TAG, "Checked if shortcut exists, should follow up: " + !isConversation);
+ }
+ return isConversation;
+ } catch (Exception e) {
+ if (DEBUG) Log.d(TAG, "Error checking if backed up info is a shortcut.");
+ return false;
+ }
+ }
+
+ /** Parses default file {@code entry} to determine the entry's type.*/
+ public static SharedFileEntryType getEntryType(Map.Entry<String, ?> entry) {
+ String key = entry.getKey();
+ if (key == null) {
+ return SharedFileEntryType.UNKNOWN;
+ }
+
+ try {
+ int id = Integer.parseInt(key);
+ try {
+ String contactUri = (String) entry.getValue();
+ } catch (Exception e) {
+ Log.w(TAG, "Malformed value, skipping:" + entry.getValue());
+ return SharedFileEntryType.UNKNOWN;
+ }
+ return SharedFileEntryType.WIDGET_ID;
+ } catch (NumberFormatException ignored) { }
+
+ try {
+ Set<String> widgetIds = (Set<String>) entry.getValue();
+ } catch (Exception e) {
+ Log.w(TAG, "Malformed value, skipping:" + entry.getValue());
+ return SharedFileEntryType.UNKNOWN;
+ }
+
+ PeopleTileKey peopleTileKey = PeopleTileKey.fromString(key);
+ if (peopleTileKey != null) {
+ return SharedFileEntryType.PEOPLE_TILE_KEY;
+ }
+
+ try {
+ Uri uri = Uri.parse(key);
+ return SharedFileEntryType.CONTACT_URI;
+ } catch (Exception e) {
+ return SharedFileEntryType.UNKNOWN;
+ }
+ }
+
+ /** Sends a broadcast to update the existing Conversation widgets. */
+ public static void updateWidgets(Context context) {
+ int[] widgetIds = AppWidgetManager.getInstance(context)
+ .getAppWidgetIds(new ComponentName(context, PeopleSpaceWidgetProvider.class));
+ if (DEBUG) {
+ for (int id : widgetIds) {
+ Log.d(TAG, "Calling update to widget: " + id);
+ }
+ }
+ if (widgetIds != null && widgetIds.length != 0) {
+ Intent intent = new Intent(context, PeopleSpaceWidgetProvider.class);
+ intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
+ intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, widgetIds);
+ context.sendBroadcast(intent);
+ }
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/people/widget/PeopleSpaceWidgetManager.java b/packages/SystemUI/src/com/android/systemui/people/widget/PeopleSpaceWidgetManager.java
index 62a0df2..72cddd0 100644
--- a/packages/SystemUI/src/com/android/systemui/people/widget/PeopleSpaceWidgetManager.java
+++ b/packages/SystemUI/src/com/android/systemui/people/widget/PeopleSpaceWidgetManager.java
@@ -22,6 +22,7 @@
import static android.app.NotificationManager.INTERRUPTION_FILTER_NONE;
import static android.app.NotificationManager.INTERRUPTION_FILTER_PRIORITY;
import static android.content.Intent.ACTION_BOOT_COMPLETED;
+import static android.content.Intent.ACTION_PACKAGE_ADDED;
import static android.content.Intent.ACTION_PACKAGE_REMOVED;
import static android.service.notification.ZenPolicy.CONVERSATION_SENDERS_ANYONE;
@@ -29,6 +30,7 @@
import static com.android.systemui.people.NotificationHelper.getHighestPriorityNotification;
import static com.android.systemui.people.NotificationHelper.shouldFilterOut;
import static com.android.systemui.people.NotificationHelper.shouldMatchNotificationByUri;
+import static com.android.systemui.people.PeopleBackupFollowUpJob.SHARED_FOLLOW_UP;
import static com.android.systemui.people.PeopleSpaceUtils.EMPTY_STRING;
import static com.android.systemui.people.PeopleSpaceUtils.INVALID_USER_ID;
import static com.android.systemui.people.PeopleSpaceUtils.PACKAGE_NAME;
@@ -38,6 +40,7 @@
import static com.android.systemui.people.PeopleSpaceUtils.getMessagesCount;
import static com.android.systemui.people.PeopleSpaceUtils.getNotificationsByUri;
import static com.android.systemui.people.PeopleSpaceUtils.removeNotificationFields;
+import static com.android.systemui.people.widget.PeopleBackupHelper.getEntryType;
import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -46,6 +49,8 @@
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Person;
+import android.app.backup.BackupManager;
+import android.app.job.JobScheduler;
import android.app.people.ConversationChannel;
import android.app.people.IPeopleManager;
import android.app.people.PeopleManager;
@@ -84,8 +89,10 @@
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.dagger.qualifiers.Background;
import com.android.systemui.people.NotificationHelper;
+import com.android.systemui.people.PeopleBackupFollowUpJob;
import com.android.systemui.people.PeopleSpaceUtils;
import com.android.systemui.people.PeopleTileViewHelper;
+import com.android.systemui.people.SharedPreferencesHelper;
import com.android.systemui.statusbar.NotificationListener;
import com.android.systemui.statusbar.NotificationListener.NotificationHandler;
import com.android.systemui.statusbar.notification.NotificationEntryManager;
@@ -93,6 +100,7 @@
import com.android.wm.shell.bubbles.Bubbles;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
@@ -126,6 +134,7 @@
private Optional<Bubbles> mBubblesOptional;
private UserManager mUserManager;
private PeopleSpaceWidgetManager mManager;
+ private BackupManager mBackupManager;
public UiEventLogger mUiEventLogger = new UiEventLoggerImpl();
private NotificationManager mNotificationManager;
private BroadcastDispatcher mBroadcastDispatcher;
@@ -164,6 +173,7 @@
ServiceManager.getService(Context.NOTIFICATION_SERVICE));
mBubblesOptional = bubblesOptional;
mUserManager = userManager;
+ mBackupManager = new BackupManager(context);
mNotificationManager = notificationManager;
mManager = this;
mBroadcastDispatcher = broadcastDispatcher;
@@ -189,6 +199,7 @@
null /* executor */, UserHandle.ALL);
IntentFilter perAppFilter = new IntentFilter(ACTION_PACKAGE_REMOVED);
+ perAppFilter.addAction(ACTION_PACKAGE_ADDED);
perAppFilter.addDataScheme("package");
// BroadcastDispatcher doesn't allow data schemes.
mContext.registerReceiver(mBaseBroadcastReceiver, perAppFilter);
@@ -224,7 +235,7 @@
AppWidgetManager appWidgetManager, IPeopleManager iPeopleManager,
PeopleManager peopleManager, LauncherApps launcherApps,
NotificationEntryManager notificationEntryManager, PackageManager packageManager,
- Optional<Bubbles> bubblesOptional, UserManager userManager,
+ Optional<Bubbles> bubblesOptional, UserManager userManager, BackupManager backupManager,
INotificationManager iNotificationManager, NotificationManager notificationManager,
@Background Executor executor) {
mContext = context;
@@ -236,6 +247,7 @@
mPackageManager = packageManager;
mBubblesOptional = bubblesOptional;
mUserManager = userManager;
+ mBackupManager = backupManager;
mINotificationManager = iNotificationManager;
mNotificationManager = notificationManager;
mManager = this;
@@ -257,8 +269,6 @@
if (DEBUG) Log.d(TAG, "no widgets to update");
return;
}
-
- if (DEBUG) Log.d(TAG, "updating " + widgetIds.length + " widgets: " + widgetIds);
synchronized (mLock) {
updateSingleConversationWidgets(widgetIds);
}
@@ -274,6 +284,7 @@
public void updateSingleConversationWidgets(int[] appWidgetIds) {
Map<Integer, PeopleSpaceTile> widgetIdToTile = new HashMap<>();
for (int appWidgetId : appWidgetIds) {
+ if (DEBUG) Log.d(TAG, "Updating widget: " + appWidgetId);
PeopleSpaceTile tile = getTileForExistingWidget(appWidgetId);
if (tile == null) {
Log.e(TAG, "Matching conversation not found for shortcut ID");
@@ -293,7 +304,8 @@
private void updateAppWidgetViews(int appWidgetId, PeopleSpaceTile tile, Bundle options) {
PeopleTileKey key = getKeyFromStorageByWidgetId(appWidgetId);
if (DEBUG) Log.d(TAG, "Widget: " + appWidgetId + " for: " + key.toString());
- if (!key.isValid()) {
+
+ if (!PeopleTileKey.isValid(key)) {
Log.e(TAG, "Cannot update invalid widget");
return;
}
@@ -301,6 +313,7 @@
options, key);
// Tell the AppWidgetManager to perform an update on the current app widget.
+ if (DEBUG) Log.d(TAG, "Calling update widget for widgetId: " + appWidgetId);
mAppWidgetManager.updateAppWidget(appWidgetId, views);
}
@@ -314,6 +327,9 @@
/** Updates tile in app widget options and the current view. */
public void updateAppWidgetOptionsAndView(int appWidgetId, PeopleSpaceTile tile) {
+ if (tile == null) {
+ if (DEBUG) Log.w(TAG, "Storing null tile");
+ }
synchronized (mTiles) {
mTiles.put(appWidgetId, tile);
}
@@ -368,7 +384,7 @@
@Nullable
public PeopleSpaceTile getTileFromPersistentStorage(PeopleTileKey key, int appWidgetId) throws
PackageManager.NameNotFoundException {
- if (!key.isValid()) {
+ if (!PeopleTileKey.isValid(key)) {
Log.e(TAG, "PeopleTileKey invalid: " + key.toString());
return null;
}
@@ -430,7 +446,8 @@
try {
PeopleTileKey key = new PeopleTileKey(
sbn.getShortcutId(), sbn.getUser().getIdentifier(), sbn.getPackageName());
- if (!key.isValid()) {
+ if (!PeopleTileKey.isValid(key)) {
+ Log.d(TAG, "Sbn doesn't contain valid PeopleTileKey: " + key.toString());
return;
}
int[] widgetIds = mAppWidgetManager.getAppWidgetIds(
@@ -561,7 +578,7 @@
if (DEBUG) Log.d(TAG, "Augmenting tile from notification, key: " + key.toString());
return augmentTileFromNotification(mContext, tile, key, highestPriority, messagesCount,
- appWidgetId);
+ appWidgetId, mBackupManager);
}
/** Returns an augmented tile for an existing widget. */
@@ -588,7 +605,7 @@
/** Returns stored widgets for the conversation specified. */
public Set<String> getMatchingKeyWidgetIds(PeopleTileKey key) {
- if (!key.isValid()) {
+ if (!PeopleTileKey.isValid(key)) {
return new HashSet<>();
}
return new HashSet<>(mSharedPrefs.getStringSet(key.toString(), new HashSet<>()));
@@ -776,7 +793,7 @@
// PeopleTileKey arguments.
if (DEBUG) Log.d(TAG, "onAppWidgetOptionsChanged called for widget: " + appWidgetId);
PeopleTileKey optionsKey = AppWidgetOptionsHelper.getPeopleTileKeyFromBundle(newOptions);
- if (optionsKey.isValid()) {
+ if (PeopleTileKey.isValid(optionsKey)) {
if (DEBUG) {
Log.d(TAG, "PeopleTileKey was present in Options, shortcutId: "
+ optionsKey.getShortcutId());
@@ -808,7 +825,7 @@
existingKeyIfStored = getKeyFromStorageByWidgetId(appWidgetId);
}
// Delete previous storage if the widget already existed and is just reconfigured.
- if (existingKeyIfStored.isValid()) {
+ if (PeopleTileKey.isValid(existingKeyIfStored)) {
if (DEBUG) Log.d(TAG, "Remove previous storage for widget: " + appWidgetId);
deleteWidgets(new int[]{appWidgetId});
} else {
@@ -820,7 +837,7 @@
synchronized (mLock) {
if (DEBUG) Log.d(TAG, "Add storage for : " + key.toString());
PeopleSpaceUtils.setSharedPreferencesStorageForTile(mContext, key, appWidgetId,
- tile.getContactUri());
+ tile.getContactUri(), mBackupManager);
}
if (DEBUG) Log.d(TAG, "Ensure listener is registered for widget: " + appWidgetId);
registerConversationListenerIfNeeded(appWidgetId, key);
@@ -838,7 +855,7 @@
/** Registers a conversation listener for {@code appWidgetId} if not already registered. */
public void registerConversationListenerIfNeeded(int widgetId, PeopleTileKey key) {
// Retrieve storage needed for registration.
- if (!key.isValid()) {
+ if (!PeopleTileKey.isValid(key)) {
if (DEBUG) Log.w(TAG, "Could not register listener for widget: " + widgetId);
return;
}
@@ -887,7 +904,7 @@
widgetSp.getString(SHORTCUT_ID, null),
widgetSp.getInt(USER_ID, INVALID_USER_ID),
widgetSp.getString(PACKAGE_NAME, null));
- if (!key.isValid()) {
+ if (!PeopleTileKey.isValid(key)) {
if (DEBUG) Log.e(TAG, "Could not delete " + widgetId);
return;
}
@@ -1053,6 +1070,7 @@
return;
}
for (int appWidgetId : appWidgetIds) {
+ if (DEBUG) Log.d(TAG, "Updating widget from broadcast, widget id: " + appWidgetId);
PeopleSpaceTile existingTile = null;
PeopleSpaceTile updatedTile = null;
try {
@@ -1060,7 +1078,7 @@
existingTile = getTileForExistingWidgetThrowing(appWidgetId);
if (existingTile == null) {
Log.e(TAG, "Matching conversation not found for shortcut ID");
- return;
+ continue;
}
updatedTile = getTileWithCurrentState(existingTile, entryPoint);
updateAppWidgetOptionsAndView(appWidgetId, updatedTile);
@@ -1068,6 +1086,14 @@
} catch (PackageManager.NameNotFoundException e) {
// Delete data for uninstalled widgets.
Log.e(TAG, "Package no longer found for tile: " + e);
+ JobScheduler jobScheduler = mContext.getSystemService(JobScheduler.class);
+ if (jobScheduler != null
+ && jobScheduler.getPendingJob(PeopleBackupFollowUpJob.JOB_ID) != null) {
+ if (DEBUG) {
+ Log.d(TAG, "Device was recently restored, wait before deleting storage.");
+ }
+ continue;
+ }
synchronized (mLock) {
updateAppWidgetOptionsAndView(appWidgetId, updatedTile);
}
@@ -1185,4 +1211,139 @@
return PeopleSpaceTile.BLOCK_CONVERSATIONS;
}
}
+
+ /**
+ * Modifies widgets storage after a restore operation, since widget ids get remapped on restore.
+ * This is guaranteed to run after the PeopleBackupHelper restore operation.
+ */
+ public void remapWidgets(int[] oldWidgetIds, int[] newWidgetIds) {
+ if (DEBUG) {
+ Log.d(TAG, "Remapping widgets, old: " + Arrays.toString(oldWidgetIds) + ". new: "
+ + Arrays.toString(newWidgetIds));
+ }
+
+ Map<String, String> widgets = new HashMap<>();
+ for (int i = 0; i < oldWidgetIds.length; i++) {
+ widgets.put(String.valueOf(oldWidgetIds[i]), String.valueOf(newWidgetIds[i]));
+ }
+
+ remapWidgetFiles(widgets);
+ remapSharedFile(widgets);
+ remapFollowupFile(widgets);
+
+ int[] widgetIds = mAppWidgetManager.getAppWidgetIds(
+ new ComponentName(mContext, PeopleSpaceWidgetProvider.class));
+ Bundle b = new Bundle();
+ b.putBoolean(AppWidgetManager.OPTION_APPWIDGET_RESTORE_COMPLETED, true);
+ for (int id : widgetIds) {
+ if (DEBUG) Log.d(TAG, "Setting widget as restored, widget id:" + id);
+ mAppWidgetManager.updateAppWidgetOptions(id, b);
+ }
+
+ updateWidgets(widgetIds);
+ }
+
+ /** Remaps widget ids in widget specific files. */
+ public void remapWidgetFiles(Map<String, String> widgets) {
+ if (DEBUG) Log.d(TAG, "Remapping widget files");
+ for (Map.Entry<String, String> entry : widgets.entrySet()) {
+ String from = String.valueOf(entry.getKey());
+ String to = String.valueOf(entry.getValue());
+
+ SharedPreferences src = mContext.getSharedPreferences(from, Context.MODE_PRIVATE);
+ PeopleTileKey key = SharedPreferencesHelper.getPeopleTileKey(src);
+ if (PeopleTileKey.isValid(key)) {
+ if (DEBUG) {
+ Log.d(TAG, "Moving PeopleTileKey: " + key.toString() + " from file: "
+ + from + ", to file: " + to);
+ }
+ SharedPreferences dest = mContext.getSharedPreferences(to, Context.MODE_PRIVATE);
+ SharedPreferencesHelper.setPeopleTileKey(dest, key);
+ SharedPreferencesHelper.clear(src);
+ }
+ }
+ }
+
+ /** Remaps widget ids in default shared storage. */
+ public void remapSharedFile(Map<String, String> widgets) {
+ if (DEBUG) Log.d(TAG, "Remapping shared file");
+ SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(mContext);
+ SharedPreferences.Editor editor = sp.edit();
+ Map<String, ?> all = sp.getAll();
+ for (Map.Entry<String, ?> entry : all.entrySet()) {
+ String key = entry.getKey();
+ PeopleBackupHelper.SharedFileEntryType keyType = getEntryType(entry);
+ if (DEBUG) Log.d(TAG, "Remapping key:" + key);
+ switch (keyType) {
+ case WIDGET_ID:
+ String newId = widgets.get(key);
+ if (TextUtils.isEmpty(newId)) {
+ Log.w(TAG, "Key is widget id without matching new id, skipping: " + key);
+ break;
+ }
+ if (DEBUG) Log.d(TAG, "Key is widget id: " + key + ", replace with: " + newId);
+ try {
+ editor.putString(newId, (String) entry.getValue());
+ } catch (Exception e) {
+ Log.e(TAG, "Malformed entry value: " + entry.getValue());
+ }
+ editor.remove(key);
+ break;
+ case PEOPLE_TILE_KEY:
+ case CONTACT_URI:
+ Set<String> oldWidgetIds;
+ try {
+ oldWidgetIds = (Set<String>) entry.getValue();
+ } catch (Exception e) {
+ Log.e(TAG, "Malformed entry value: " + entry.getValue());
+ editor.remove(key);
+ break;
+ }
+ Set<String> newWidgets = getNewWidgets(oldWidgetIds, widgets);
+ if (DEBUG) {
+ Log.d(TAG, "Key is PeopleTileKey or contact URI: " + key
+ + ", replace values with new ids: " + newWidgets);
+ }
+ editor.putStringSet(key, newWidgets);
+ break;
+ case UNKNOWN:
+ Log.e(TAG, "Key not identified:" + key);
+ }
+ }
+ editor.apply();
+ }
+
+ /** Remaps widget ids in follow-up job file. */
+ public void remapFollowupFile(Map<String, String> widgets) {
+ if (DEBUG) Log.d(TAG, "Remapping follow up file");
+ SharedPreferences followUp = mContext.getSharedPreferences(
+ SHARED_FOLLOW_UP, Context.MODE_PRIVATE);
+ SharedPreferences.Editor followUpEditor = followUp.edit();
+ Map<String, ?> followUpAll = followUp.getAll();
+ for (Map.Entry<String, ?> entry : followUpAll.entrySet()) {
+ String key = entry.getKey();
+ Set<String> oldWidgetIds;
+ try {
+ oldWidgetIds = (Set<String>) entry.getValue();
+ } catch (Exception e) {
+ Log.e(TAG, "Malformed entry value: " + entry.getValue());
+ followUpEditor.remove(key);
+ continue;
+ }
+ Set<String> newWidgets = getNewWidgets(oldWidgetIds, widgets);
+ if (DEBUG) {
+ Log.d(TAG, "Follow up key: " + key + ", replace with new ids: " + newWidgets);
+ }
+ followUpEditor.putStringSet(key, newWidgets);
+ }
+ followUpEditor.apply();
+ }
+
+ private Set<String> getNewWidgets(Set<String> oldWidgets, Map<String, String> widgetsMapping) {
+ return oldWidgets
+ .stream()
+ .map(widgetsMapping::get)
+ .filter(id -> !TextUtils.isEmpty(id))
+ .collect(Collectors.toSet());
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/people/widget/PeopleSpaceWidgetPinnedReceiver.java b/packages/SystemUI/src/com/android/systemui/people/widget/PeopleSpaceWidgetPinnedReceiver.java
index a28da43..c4be197 100644
--- a/packages/SystemUI/src/com/android/systemui/people/widget/PeopleSpaceWidgetPinnedReceiver.java
+++ b/packages/SystemUI/src/com/android/systemui/people/widget/PeopleSpaceWidgetPinnedReceiver.java
@@ -75,7 +75,7 @@
String packageName = intent.getStringExtra(Intent.EXTRA_PACKAGE_NAME);
int userId = intent.getIntExtra(Intent.EXTRA_USER_ID, INVALID_USER_ID);
PeopleTileKey key = new PeopleTileKey(shortcutId, userId, packageName);
- if (!key.isValid()) {
+ if (!PeopleTileKey.isValid(key)) {
if (DEBUG) Log.w(TAG, "Skipping: key is not valid: " + key.toString());
return;
}
diff --git a/packages/SystemUI/src/com/android/systemui/people/widget/PeopleSpaceWidgetProvider.java b/packages/SystemUI/src/com/android/systemui/people/widget/PeopleSpaceWidgetProvider.java
index 3522b76..36939b7 100644
--- a/packages/SystemUI/src/com/android/systemui/people/widget/PeopleSpaceWidgetProvider.java
+++ b/packages/SystemUI/src/com/android/systemui/people/widget/PeopleSpaceWidgetProvider.java
@@ -70,6 +70,13 @@
mPeopleSpaceWidgetManager.deleteWidgets(appWidgetIds);
}
+ @Override
+ public void onRestored(Context context, int[] oldWidgetIds, int[] newWidgetIds) {
+ super.onRestored(context, oldWidgetIds, newWidgetIds);
+ ensurePeopleSpaceWidgetManagerInitialized();
+ mPeopleSpaceWidgetManager.remapWidgets(oldWidgetIds, newWidgetIds);
+ }
+
private void ensurePeopleSpaceWidgetManagerInitialized() {
mPeopleSpaceWidgetManager.init();
}
diff --git a/packages/SystemUI/src/com/android/systemui/people/widget/PeopleTileKey.java b/packages/SystemUI/src/com/android/systemui/people/widget/PeopleTileKey.java
index 319df85..6e6ca25 100644
--- a/packages/SystemUI/src/com/android/systemui/people/widget/PeopleTileKey.java
+++ b/packages/SystemUI/src/com/android/systemui/people/widget/PeopleTileKey.java
@@ -25,6 +25,8 @@
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import java.util.Objects;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
/** Class that encapsulates fields identifying a Conversation. */
public class PeopleTileKey {
@@ -32,6 +34,8 @@
private int mUserId;
private String mPackageName;
+ private static final Pattern KEY_PATTERN = Pattern.compile("(.+)/(-?\\d+)/(\\p{L}.*)");
+
public PeopleTileKey(String shortcutId, int userId, String packageName) {
mShortcutId = shortcutId;
mUserId = userId;
@@ -66,8 +70,12 @@
return mPackageName;
}
+ public void setUserId(int userId) {
+ mUserId = userId;
+ }
+
/** Returns whether PeopleTileKey is valid/well-formed. */
- public boolean isValid() {
+ private boolean validate() {
return !TextUtils.isEmpty(mShortcutId) && !TextUtils.isEmpty(mPackageName) && mUserId >= 0;
}
@@ -88,10 +96,31 @@
*/
@Override
public String toString() {
- if (!isValid()) return EMPTY_STRING;
return mShortcutId + "/" + mUserId + "/" + mPackageName;
}
+ /** Parses {@code key} into a {@link PeopleTileKey}. */
+ public static PeopleTileKey fromString(String key) {
+ if (key == null) {
+ return null;
+ }
+ Matcher m = KEY_PATTERN.matcher(key);
+ if (m.find()) {
+ try {
+ int userId = Integer.parseInt(m.group(2));
+ return new PeopleTileKey(m.group(1), userId, m.group(3));
+ } catch (NumberFormatException e) {
+ return null;
+ }
+ }
+ return null;
+ }
+
+ /** Returns whether {@code key} is a valid {@link PeopleTileKey}. */
+ public static boolean isValid(PeopleTileKey key) {
+ return key != null && key.validate();
+ }
+
@Override
public boolean equals(Object other) {
if (this == other) {
diff --git a/packages/SystemUI/src/com/android/systemui/power/InattentiveSleepWarningView.java b/packages/SystemUI/src/com/android/systemui/power/InattentiveSleepWarningView.java
index 1ed98c0..03d1f15 100644
--- a/packages/SystemUI/src/com/android/systemui/power/InattentiveSleepWarningView.java
+++ b/packages/SystemUI/src/com/android/systemui/power/InattentiveSleepWarningView.java
@@ -93,6 +93,8 @@
setAlpha(1f);
setVisibility(View.VISIBLE);
mWindowManager.addView(this, getLayoutParams(mWindowToken));
+ announceForAccessibility(
+ getContext().getString(R.string.inattentive_sleep_warning_message));
}
/**
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java b/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java
index 6660081..74550f2 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java
@@ -28,12 +28,8 @@
import android.view.WindowInsets;
import android.widget.FrameLayout;
-import androidx.dynamicanimation.animation.FloatPropertyCompat;
-import androidx.dynamicanimation.animation.SpringForce;
-
import com.android.systemui.R;
import com.android.systemui.qs.customize.QSCustomizer;
-import com.android.wm.shell.animation.PhysicsAnimator;
/**
* Wrapper view with background which contains {@link QSPanel} and {@link QuickStatusBarHeader}
@@ -41,26 +37,10 @@
public class QSContainerImpl extends FrameLayout {
private final Point mSizePoint = new Point();
- private static final FloatPropertyCompat<QSContainerImpl> BACKGROUND_BOTTOM =
- new FloatPropertyCompat<QSContainerImpl>("backgroundBottom") {
- @Override
- public float getValue(QSContainerImpl qsImpl) {
- return qsImpl.getBackgroundBottom();
- }
-
- @Override
- public void setValue(QSContainerImpl background, float value) {
- background.setBackgroundBottom((int) value);
- }
- };
- private static final PhysicsAnimator.SpringConfig BACKGROUND_SPRING
- = new PhysicsAnimator.SpringConfig(SpringForce.STIFFNESS_MEDIUM,
- SpringForce.DAMPING_RATIO_LOW_BOUNCY);
private int mFancyClippingTop;
private int mFancyClippingBottom;
private final float[] mFancyClippingRadii = new float[] {0, 0, 0, 0, 0, 0, 0, 0};
private final Path mFancyClippingPath = new Path();
- private int mBackgroundBottom = 0;
private int mHeightOverride = -1;
private View mQSDetail;
private QuickStatusBarHeader mHeader;
@@ -71,7 +51,6 @@
private int mSideMargins;
private boolean mQsDisabled;
private int mContentPadding = -1;
- private boolean mAnimateBottomOnNextLayout;
private int mNavBarInset = 0;
private boolean mClippingEnabled;
@@ -86,11 +65,6 @@
mQSDetail = findViewById(R.id.qs_detail);
mHeader = findViewById(R.id.header);
mQSCustomizer = findViewById(R.id.qs_customize);
- mHeader.getHeaderQsPanel().setMediaVisibilityChangedListener((visible) -> {
- if (mHeader.getHeaderQsPanel().isShown()) {
- mAnimateBottomOnNextLayout = true;
- }
- });
setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_NO);
}
@@ -99,20 +73,6 @@
return false;
}
- void onMediaVisibilityChanged(boolean qsVisible) {
- mAnimateBottomOnNextLayout = qsVisible;
- }
-
- private void setBackgroundBottom(int value) {
- // We're saving the bottom separately since otherwise the bottom would be overridden in
- // the layout and the animation wouldn't properly start at the old position.
- mBackgroundBottom = value;
- }
-
- private float getBackgroundBottom() {
- return mBackgroundBottom;
- }
-
@Override
protected void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
@@ -186,8 +146,7 @@
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
- updateExpansion(mAnimateBottomOnNextLayout /* animate */);
- mAnimateBottomOnNextLayout = false;
+ updateExpansion();
updateClippingPath();
}
@@ -230,31 +189,12 @@
}
public void updateExpansion() {
- updateExpansion(false /* animate */);
- }
-
- public void updateExpansion(boolean animate) {
int height = calculateContainerHeight();
int scrollBottom = calculateContainerBottom();
setBottom(getTop() + height);
mQSDetail.setBottom(getTop() + scrollBottom);
int qsDetailBottomMargin = ((MarginLayoutParams) mQSDetail.getLayoutParams()).bottomMargin;
mQSDetail.setBottom(getTop() + scrollBottom - qsDetailBottomMargin);
- updateBackgroundBottom(scrollBottom, animate);
- }
-
- private void updateBackgroundBottom(int height, boolean animated) {
- PhysicsAnimator<QSContainerImpl> physicsAnimator = PhysicsAnimator.getInstance(this);
- if (physicsAnimator.isPropertyAnimating(BACKGROUND_BOTTOM) || animated) {
- // An animation is running or we want to animate
- // Let's make sure to set the currentValue again, since the call below might only
- // start in the next frame and otherwise we'd flicker
- BACKGROUND_BOTTOM.setValue(this, BACKGROUND_BOTTOM.getValue(this));
- physicsAnimator.spring(BACKGROUND_BOTTOM, height, BACKGROUND_SPRING).start();
- } else {
- BACKGROUND_BOTTOM.setValue(this, height);
- }
-
}
protected int calculateContainerHeight() {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSContainerImplController.java b/packages/SystemUI/src/com/android/systemui/qs/QSContainerImplController.java
index 3638395..7d61991 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSContainerImplController.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSContainerImplController.java
@@ -61,12 +61,6 @@
@Override
protected void onViewAttached() {
mView.updateResources(mQsPanelController, mQuickStatusBarHeaderController);
- mQsPanelController.setMediaVisibilityChangedListener((visible) -> {
- if (mQsPanelController.isShown()) {
- mView.onMediaVisibilityChanged(true);
- }
- });
-
mConfigurationController.addCallback(mConfigurationListener);
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java
index c28c649..998cff2 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java
@@ -53,6 +53,8 @@
import com.android.systemui.util.LifecycleFragment;
import com.android.systemui.util.Utils;
+import java.util.function.Consumer;
+
import javax.inject.Inject;
import javax.inject.Named;
@@ -281,6 +283,11 @@
return mLastQSExpansion == 0.0f || mLastQSExpansion == -1;
}
+ @Override
+ public void setCollapsedMediaVisibilityChangedListener(Consumer<Boolean> listener) {
+ mQuickQSPanelController.setMediaVisibilityChangedListener(listener);
+ }
+
private void setEditLocation(View view) {
View edit = view.findViewById(android.R.id.edit);
int[] loc = edit.getLocationOnScreen();
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java
index c70eaff..7c7f566 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java
@@ -46,7 +46,6 @@
import java.util.ArrayList;
import java.util.List;
-import java.util.function.Consumer;
/** View that represents the quick settings tile panel (when expanded/pulled down). **/
public class QSPanel extends LinearLayout implements Tunable {
@@ -99,13 +98,8 @@
private LinearLayout mHorizontalLinearLayout;
protected LinearLayout mHorizontalContentContainer;
- // Only used with media
- private QSTileLayout mHorizontalTileLayout;
- protected QSTileLayout mRegularTileLayout;
protected QSTileLayout mTileLayout;
- private int mLastOrientation = -1;
private int mMediaTotalBottomMargin;
- private Consumer<Boolean> mMediaVisibilityChangedListener;
public QSPanel(Context context, AttributeSet attrs) {
super(context, attrs);
@@ -121,8 +115,7 @@
}
void initialize() {
- mRegularTileLayout = createRegularTileLayout();
- mTileLayout = mRegularTileLayout;
+ mTileLayout = getOrCreateTileLayout();
if (mUsingMediaPlayer) {
mHorizontalLinearLayout = new RemeasuringLinearLayout(mContext);
@@ -135,7 +128,6 @@
mHorizontalContentContainer.setClipChildren(true);
mHorizontalContentContainer.setClipToPadding(false);
- mHorizontalTileLayout = createHorizontalTileLayout();
LayoutParams lp = new LayoutParams(0, LayoutParams.WRAP_CONTENT, 1);
int marginSize = (int) mContext.getResources().getDimension(R.dimen.qs_media_padding);
lp.setMarginStart(0);
@@ -148,12 +140,6 @@
}
}
- protected void onMediaVisibilityChanged(Boolean visible) {
- if (mMediaVisibilityChangedListener != null) {
- mMediaVisibilityChangedListener.accept(visible);
- }
- }
-
/**
* Add brightness view above the tile layout.
*
@@ -184,17 +170,12 @@
}
/** */
- public QSTileLayout createRegularTileLayout() {
- if (mRegularTileLayout == null) {
- mRegularTileLayout = (QSTileLayout) LayoutInflater.from(mContext)
+ public QSTileLayout getOrCreateTileLayout() {
+ if (mTileLayout == null) {
+ mTileLayout = (QSTileLayout) LayoutInflater.from(mContext)
.inflate(R.layout.qs_paged_tile_layout, this, false);
}
- return mRegularTileLayout;
- }
-
-
- protected QSTileLayout createHorizontalTileLayout() {
- return createRegularTileLayout();
+ return mTileLayout;
}
@Override
@@ -281,18 +262,18 @@
* @param pageIndicator indicator to use for page scrolling
*/
public void setFooterPageIndicator(PageIndicator pageIndicator) {
- if (mRegularTileLayout instanceof PagedTileLayout) {
+ if (mTileLayout instanceof PagedTileLayout) {
mFooterPageIndicator = pageIndicator;
updatePageIndicator();
}
}
private void updatePageIndicator() {
- if (mRegularTileLayout instanceof PagedTileLayout) {
+ if (mTileLayout instanceof PagedTileLayout) {
if (mFooterPageIndicator != null) {
mFooterPageIndicator.setVisibility(View.GONE);
- ((PagedTileLayout) mRegularTileLayout).setPageIndicator(mFooterPageIndicator);
+ ((PagedTileLayout) mTileLayout).setPageIndicator(mFooterPageIndicator);
}
}
}
@@ -362,7 +343,7 @@
return true;
}
- protected boolean needsDynamicRowsAndColumns() {
+ private boolean needsDynamicRowsAndColumns() {
return true;
}
@@ -667,10 +648,6 @@
mHeaderContainer = headerContainer;
}
- public void setMediaVisibilityChangedListener(Consumer<Boolean> visibilityChangedListener) {
- mMediaVisibilityChangedListener = visibilityChangedListener;
- }
-
public boolean isListening() {
return mListening;
}
@@ -681,39 +658,20 @@
}
protected void setPageMargin(int pageMargin) {
- if (mRegularTileLayout instanceof PagedTileLayout) {
- ((PagedTileLayout) mRegularTileLayout).setPageMargin(pageMargin);
- }
- if (mHorizontalTileLayout != mRegularTileLayout
- && mHorizontalTileLayout instanceof PagedTileLayout) {
- ((PagedTileLayout) mHorizontalTileLayout).setPageMargin(pageMargin);
+ if (mTileLayout instanceof PagedTileLayout) {
+ ((PagedTileLayout) mTileLayout).setPageMargin(pageMargin);
}
}
- void setUsingHorizontalLayout(boolean horizontal, ViewGroup mediaHostView, boolean force,
- UiEventLogger uiEventLogger) {
+ void setUsingHorizontalLayout(boolean horizontal, ViewGroup mediaHostView, boolean force) {
if (horizontal != mUsingHorizontalLayout || force) {
mUsingHorizontalLayout = horizontal;
- View visibleView = horizontal ? mHorizontalLinearLayout : (View) mRegularTileLayout;
- View hiddenView = horizontal ? (View) mRegularTileLayout : mHorizontalLinearLayout;
ViewGroup newParent = horizontal ? mHorizontalContentContainer : this;
- QSPanel.QSTileLayout newLayout = horizontal
- ? mHorizontalTileLayout : mRegularTileLayout;
- if (hiddenView != null
- && (mRegularTileLayout != mHorizontalTileLayout
- || hiddenView != mRegularTileLayout)) {
- // Only hide the view if the horizontal and the regular view are different,
- // otherwise its reattached.
- hiddenView.setVisibility(View.GONE);
- }
- visibleView.setVisibility(View.VISIBLE);
- switchAllContentToParent(newParent, newLayout);
+ switchAllContentToParent(newParent, mTileLayout);
reAttachMediaHost(mediaHostView, horizontal);
- mTileLayout = newLayout;
- newLayout.setListening(mListening, uiEventLogger);
if (needsDynamicRowsAndColumns()) {
- newLayout.setMinRows(horizontal ? 2 : 1);
- newLayout.setMaxColumns(horizontal ? 2 : 4);
+ mTileLayout.setMinRows(horizontal ? 2 : 1);
+ mTileLayout.setMaxColumns(horizontal ? 2 : 4);
}
updateMargins(mediaHostView);
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java
index ac92d4f..ae0f510 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java
@@ -45,8 +45,6 @@
import com.android.systemui.statusbar.policy.BrightnessMirrorController;
import com.android.systemui.tuner.TunerService;
-import java.util.function.Consumer;
-
import javax.inject.Inject;
import javax.inject.Named;
@@ -149,14 +147,14 @@
mBrightnessMirrorController.addCallback(mBrightnessMirrorListener);
}
- ((PagedTileLayout) mView.createRegularTileLayout())
+ ((PagedTileLayout) mView.getOrCreateTileLayout())
.setOnTouchListener(mTileLayoutTouchListener);
}
@Override
protected QSTileRevealController createTileRevealController() {
return mQsTileRevealControllerFactory.create(
- this, (PagedTileLayout) mView.createRegularTileLayout());
+ this, (PagedTileLayout) mView.getOrCreateTileLayout());
}
@Override
@@ -289,11 +287,6 @@
mView.setPageListener(listener);
}
- /** */
- public void setMediaVisibilityChangedListener(Consumer<Boolean> visibilityChangedListener) {
- mView.setMediaVisibilityChangedListener(visibilityChangedListener);
- }
-
public boolean isShown() {
return mView.isShown();
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanelControllerBase.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanelControllerBase.java
index 170785c..7a09826 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSPanelControllerBase.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanelControllerBase.java
@@ -19,6 +19,8 @@
import static com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import static com.android.systemui.qs.dagger.QSFragmentModule.QS_USING_MEDIA_PLAYER;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
import android.content.ComponentName;
import android.content.res.Configuration;
import android.metrics.LogMaker;
@@ -42,6 +44,7 @@
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Collection;
+import java.util.function.Consumer;
import java.util.stream.Collectors;
import javax.inject.Named;
@@ -68,6 +71,8 @@
protected final ArrayList<TileRecord> mRecords = new ArrayList<>();
private boolean mShouldUseSplitNotificationShade;
+ @Nullable
+ private Consumer<Boolean> mMediaVisibilityChangedListener;
private int mLastOrientation;
private String mCachedSpecs = "";
private QSTileRevealController mQsTileRevealController;
@@ -89,7 +94,9 @@
};
private final Function1<Boolean, Unit> mMediaHostVisibilityListener = (visible) -> {
- mView.onMediaVisibilityChanged(visible);
+ if (mMediaVisibilityChangedListener != null) {
+ mMediaVisibilityChangedListener.accept(visible);
+ }
switchTileLayout(false);
return null;
};
@@ -136,7 +143,6 @@
}
mMediaHost.addVisibilityChangeListener(mMediaHostVisibilityListener);
- mView.onMediaVisibilityChanged(mMediaHost.getVisible());
mView.addOnConfigurationChangedListener(mOnConfigurationChangedListener);
mHost.addCallback(mQSHostCallback);
setTiles();
@@ -291,20 +297,12 @@
}
boolean switchTileLayout(boolean force) {
- /** Whether or not the QuickQSPanel currently contains a media player. */
+ /* Whether or not the panel currently contains a media player. */
boolean horizontal = shouldUseHorizontalLayout();
if (horizontal != mUsingHorizontalLayout || force) {
mUsingHorizontalLayout = horizontal;
- for (QSPanelControllerBase.TileRecord record : mRecords) {
- mView.removeTile(record);
- record.tile.removeCallback(record.callback);
- }
- mView.setUsingHorizontalLayout(mUsingHorizontalLayout, mMediaHost.getHostView(), force,
- mUiEventLogger);
+ mView.setUsingHorizontalLayout(mUsingHorizontalLayout, mMediaHost.getHostView(), force);
updateMediaDisappearParameters();
-
- setTiles();
-
return true;
}
return false;
@@ -381,6 +379,13 @@
return mView.getTileLayout();
}
+ /**
+ * Add a listener for when the media visibility changes.
+ */
+ public void setMediaVisibilityChangedListener(@NonNull Consumer<Boolean> listener) {
+ mMediaVisibilityChangedListener = listener;
+ }
+
/** */
public static final class TileRecord extends QSPanel.Record {
public QSTile tile;
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSSecurityFooter.java b/packages/SystemUI/src/com/android/systemui/qs/QSSecurityFooter.java
index 3a6f1d5..7f19d0e 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSSecurityFooter.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSSecurityFooter.java
@@ -185,15 +185,22 @@
final boolean isProfileOwnerOfOrganizationOwnedDevice =
mSecurityController.isProfileOwnerOfOrganizationOwnedDevice();
final boolean isParentalControlsEnabled = mSecurityController.isParentalControlsEnabled();
+ final boolean isWorkProfileOn = mSecurityController.isWorkProfileOn();
+ final boolean hasDisclosableWorkProfilePolicy = hasCACertsInWorkProfile
+ || vpnNameWorkProfile != null || (hasWorkProfile && isNetworkLoggingEnabled);
// Update visibility of footer
- mIsVisible = (isDeviceManaged && !isDemoDevice) || hasCACerts || hasCACertsInWorkProfile
- || vpnName != null || vpnNameWorkProfile != null
- || isProfileOwnerOfOrganizationOwnedDevice || isParentalControlsEnabled
- || (hasWorkProfile && isNetworkLoggingEnabled);
+ mIsVisible = (isDeviceManaged && !isDemoDevice)
+ || hasCACerts
+ || vpnName != null
+ || isProfileOwnerOfOrganizationOwnedDevice
+ || isParentalControlsEnabled
+ || (hasDisclosableWorkProfilePolicy && isWorkProfileOn);
// Update the view to be untappable if the device is an organization-owned device with a
- // managed profile and there is no policy set which requires a privacy disclosure.
- if (mIsVisible && isProfileOwnerOfOrganizationOwnedDevice && !isNetworkLoggingEnabled
- && !hasCACertsInWorkProfile && vpnNameWorkProfile == null) {
+ // managed profile and there is either:
+ // a) no policy set which requires a privacy disclosure.
+ // b) a specific work policy set but the work profile is turned off.
+ if (mIsVisible && isProfileOwnerOfOrganizationOwnedDevice
+ && (!hasDisclosableWorkProfilePolicy || !isWorkProfileOn)) {
mRootView.setClickable(false);
mRootView.findViewById(R.id.footer_icon).setVisibility(View.GONE);
} else {
@@ -204,7 +211,8 @@
mFooterTextContent = getFooterText(isDeviceManaged, hasWorkProfile,
hasCACerts, hasCACertsInWorkProfile, isNetworkLoggingEnabled, vpnName,
vpnNameWorkProfile, organizationName, workProfileOrganizationName,
- isProfileOwnerOfOrganizationOwnedDevice, isParentalControlsEnabled);
+ isProfileOwnerOfOrganizationOwnedDevice, isParentalControlsEnabled,
+ isWorkProfileOn);
// Update the icon
int footerIconId = R.drawable.ic_info_outline;
if (vpnName != null || vpnNameWorkProfile != null) {
@@ -236,7 +244,8 @@
boolean hasCACerts, boolean hasCACertsInWorkProfile, boolean isNetworkLoggingEnabled,
String vpnName, String vpnNameWorkProfile, CharSequence organizationName,
CharSequence workProfileOrganizationName,
- boolean isProfileOwnerOfOrganizationOwnedDevice, boolean isParentalControlsEnabled) {
+ boolean isProfileOwnerOfOrganizationOwnedDevice, boolean isParentalControlsEnabled,
+ boolean isWorkProfileOn) {
if (isParentalControlsEnabled) {
return mContext.getString(R.string.quick_settings_disclosure_parental_controls);
}
@@ -280,7 +289,7 @@
organizationName);
}
} // end if(isDeviceManaged)
- if (hasCACertsInWorkProfile) {
+ if (hasCACertsInWorkProfile && isWorkProfileOn) {
if (workProfileOrganizationName == null) {
return mContext.getString(
R.string.quick_settings_disclosure_managed_profile_monitoring);
@@ -295,7 +304,7 @@
if (vpnName != null && vpnNameWorkProfile != null) {
return mContext.getString(R.string.quick_settings_disclosure_vpns);
}
- if (vpnNameWorkProfile != null) {
+ if (vpnNameWorkProfile != null && isWorkProfileOn) {
return mContext.getString(R.string.quick_settings_disclosure_managed_profile_named_vpn,
vpnNameWorkProfile);
}
@@ -308,7 +317,7 @@
return mContext.getString(R.string.quick_settings_disclosure_named_vpn,
vpnName);
}
- if (hasWorkProfile && isNetworkLoggingEnabled) {
+ if (hasWorkProfile && isNetworkLoggingEnabled && isWorkProfileOn) {
return mContext.getString(
R.string.quick_settings_disclosure_managed_profile_network_activity);
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java
index 659475d..68962b0 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java
@@ -61,21 +61,10 @@
}
@Override
- public TileLayout createRegularTileLayout() {
+ public TileLayout getOrCreateTileLayout() {
return new QQSSideLabelTileLayout(mContext);
}
- @Override
- protected QSTileLayout createHorizontalTileLayout() {
- TileLayout t = createRegularTileLayout();
- t.setMaxColumns(2);
- return t;
- }
-
- @Override
- protected boolean needsDynamicRowsAndColumns() {
- return false; // QQS always have the same layout
- }
@Override
protected boolean displayMediaMarginsOnMedia() {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java b/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java
index d017c74..b904505 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java
@@ -567,6 +567,8 @@
public void clearDrag() {
itemView.clearAnimation();
+ itemView.setScaleX(1);
+ itemView.setScaleY(1);
}
public void startDrag() {
@@ -812,5 +814,12 @@
@Override
public void onSwiped(ViewHolder viewHolder, int direction) {
}
+
+ // Just in case, make sure to animate to base state.
+ @Override
+ public void clearView(@NonNull RecyclerView recyclerView, @NonNull ViewHolder viewHolder) {
+ ((Holder) viewHolder).stopDrag();
+ super.clearView(recyclerView, viewHolder);
+ }
};
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/QuickAccessWalletTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/QuickAccessWalletTile.java
index 98cd88a..4dc7508 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/QuickAccessWalletTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/QuickAccessWalletTile.java
@@ -73,6 +73,7 @@
private final QuickAccessWalletController mController;
private WalletCard mSelectedCard;
+ private boolean mIsWalletUpdating = true;
@VisibleForTesting Drawable mCardViewDrawable;
@Inject
@@ -110,7 +111,8 @@
super.handleSetListening(listening);
if (listening) {
mController.setupWalletChangeObservers(mCardRetriever, DEFAULT_PAYMENT_APP_CHANGE);
- if (!mController.getWalletClient().isWalletServiceAvailable()) {
+ if (!mController.getWalletClient().isWalletServiceAvailable()
+ || !mController.getWalletClient().isWalletFeatureAvailable()) {
Log.i(TAG, "QAW service is unavailable, recreating the wallet client.");
mController.reCreateWalletClient();
}
@@ -158,7 +160,8 @@
state.contentDescription = state.label;
state.icon = ResourceIcon.get(R.drawable.ic_wallet_lockscreen);
boolean isDeviceLocked = !mKeyguardStateController.isUnlocked();
- if (mController.getWalletClient().isWalletServiceAvailable()) {
+ if (mController.getWalletClient().isWalletServiceAvailable()
+ && mController.getWalletClient().isWalletFeatureAvailable()) {
if (mSelectedCard != null) {
if (isDeviceLocked) {
state.state = Tile.STATE_INACTIVE;
@@ -172,7 +175,11 @@
}
} else {
state.state = Tile.STATE_INACTIVE;
- state.secondaryLabel = mContext.getString(R.string.wallet_secondary_label_no_card);
+ state.secondaryLabel =
+ mContext.getString(
+ mIsWalletUpdating
+ ? R.string.wallet_secondary_label_updating
+ : R.string.wallet_secondary_label_no_card);
state.sideViewCustomDrawable = null;
}
state.stateDescription = state.secondaryLabel;
@@ -218,6 +225,7 @@
@Override
public void onWalletCardsRetrieved(@NonNull GetWalletCardsResponse response) {
Log.i(TAG, "Successfully retrieved wallet cards.");
+ mIsWalletUpdating = false;
List<WalletCard> cards = response.getWalletCards();
if (cards.isEmpty()) {
Log.d(TAG, "No wallet cards exist.");
@@ -240,7 +248,7 @@
@Override
public void onWalletCardRetrievalError(@NonNull GetWalletCardsError error) {
- Log.w(TAG, "Error retrieve wallet cards");
+ mIsWalletUpdating = false;
mCardViewDrawable = null;
mSelectedCard = null;
refreshState();
diff --git a/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordDialog.java b/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordDialog.java
index 57125f3..df766f3 100644
--- a/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordDialog.java
+++ b/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordDialog.java
@@ -30,9 +30,9 @@
import android.view.Window;
import android.view.WindowManager;
import android.widget.ArrayAdapter;
-import android.widget.Button;
import android.widget.Spinner;
import android.widget.Switch;
+import android.widget.TextView;
import com.android.systemui.R;
import com.android.systemui.settings.UserContextProvider;
@@ -78,12 +78,12 @@
setContentView(R.layout.screen_record_dialog);
- Button cancelBtn = findViewById(R.id.button_cancel);
+ TextView cancelBtn = findViewById(R.id.button_cancel);
cancelBtn.setOnClickListener(v -> {
finish();
});
- Button startBtn = findViewById(R.id.button_start);
+ TextView startBtn = findViewById(R.id.button_start);
startBtn.setOnClickListener(v -> {
requestScreenCapture();
finish();
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/CropView.java b/packages/SystemUI/src/com/android/systemui/screenshot/CropView.java
index 0a60f6d..a9cecaa 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/CropView.java
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/CropView.java
@@ -44,6 +44,7 @@
import androidx.customview.widget.ExploreByTouchHelper;
import androidx.interpolator.view.animation.FastOutSlowInInterpolator;
+import com.android.internal.graphics.ColorUtils;
import com.android.systemui.R;
import java.util.List;
@@ -95,7 +96,9 @@
TypedArray t = context.getTheme().obtainStyledAttributes(
attrs, R.styleable.CropView, 0, 0);
mShadePaint = new Paint();
- mShadePaint.setColor(t.getColor(R.styleable.CropView_scrimColor, Color.TRANSPARENT));
+ int alpha = t.getInteger(R.styleable.CropView_scrimAlpha, 255);
+ int scrimColor = t.getColor(R.styleable.CropView_scrimColor, Color.TRANSPARENT);
+ mShadePaint.setColor(ColorUtils.setAlphaComponent(scrimColor, alpha));
mContainerBackgroundPaint = new Paint();
mContainerBackgroundPaint.setColor(t.getColor(R.styleable.CropView_containerBackgroundColor,
Color.TRANSPARENT));
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/MagnifierView.java b/packages/SystemUI/src/com/android/systemui/screenshot/MagnifierView.java
index 34b40f7..7873732 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/MagnifierView.java
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/MagnifierView.java
@@ -33,6 +33,7 @@
import androidx.annotation.Nullable;
+import com.android.internal.graphics.ColorUtils;
import com.android.systemui.R;
/**
@@ -83,7 +84,9 @@
TypedArray t = context.getTheme().obtainStyledAttributes(
attrs, R.styleable.MagnifierView, 0, 0);
mShadePaint = new Paint();
- mShadePaint.setColor(t.getColor(R.styleable.MagnifierView_scrimColor, Color.TRANSPARENT));
+ int alpha = t.getInteger(R.styleable.MagnifierView_scrimAlpha, 255);
+ int scrimColor = t.getColor(R.styleable.MagnifierView_scrimColor, Color.TRANSPARENT);
+ mShadePaint.setColor(ColorUtils.setAlphaComponent(scrimColor, alpha));
mHandlePaint = new Paint();
mHandlePaint.setColor(t.getColor(R.styleable.MagnifierView_handleColor, Color.BLACK));
mHandlePaint.setStrokeWidth(
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java
index 0bb702f..c09f98d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java
@@ -885,6 +885,11 @@
.isUnlockingWithBiometricAllowed(true /* isStrongBiometric */)) {
return;
}
+
+ if (biometricSourceType == BiometricSourceType.FACE && shouldSuppressFaceMsg()) {
+ return;
+ }
+
boolean showSwipeToUnlock =
msgId == KeyguardUpdateMonitor.BIOMETRIC_HELP_FACE_NOT_RECOGNIZED;
if (mStatusBarKeyguardViewManager.isBouncerShowing()) {
@@ -912,7 +917,8 @@
// The face timeout message is not very actionable, let's ask the user to
// manually retry.
if (!mStatusBarKeyguardViewManager.isBouncerShowing()
- && mKeyguardUpdateMonitor.isUdfpsEnrolled()) {
+ && mKeyguardUpdateMonitor.isUdfpsEnrolled()
+ && mKeyguardUpdateMonitor.isFingerprintDetectionRunning()) {
// suggest trying fingerprint
showTransientIndication(R.string.keyguard_try_fingerprint);
} else {
@@ -952,7 +958,18 @@
|| msgId == FingerprintManager.FINGERPRINT_ERROR_USER_CANCELED);
}
+ private boolean shouldSuppressFaceMsg() {
+ // For dual biometric, don't show face auth messages unless face auth was explicitly
+ // requested by the user.
+ return mKeyguardUpdateMonitor.isUdfpsEnrolled()
+ && mKeyguardUpdateMonitor.isFingerprintDetectionRunning()
+ && !mKeyguardUpdateMonitor.isFaceAuthUserRequested();
+ }
+
private boolean shouldSuppressFaceError(int msgId, KeyguardUpdateMonitor updateMonitor) {
+ if (shouldSuppressFaceMsg()) {
+ return true;
+ }
// Only checking if unlocking with Biometric is allowed (no matter strong or non-strong
// as long as primary auth, i.e. PIN/pattern/password, is not required), so it's ok to
// pass true for isStrongBiometric to isUnlockingWithBiometricAllowed() to bypass the
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationRemoteInputManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationRemoteInputManager.java
index 0b67e7e..4552138 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationRemoteInputManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationRemoteInputManager.java
@@ -369,7 +369,7 @@
});
mSmartReplyController.setCallback((entry, reply) -> {
StatusBarNotification newSbn =
- rebuildNotificationWithRemoteInput(entry, reply, true /* showSpinner */,
+ rebuildNotificationWithRemoteInputInserted(entry, reply, true /* showSpinner */,
null /* mimeType */, null /* uri */);
mEntryManager.updateNotification(newSbn, null /* ranking */);
});
@@ -638,12 +638,12 @@
@VisibleForTesting
StatusBarNotification rebuildNotificationForCanceledSmartReplies(
NotificationEntry entry) {
- return rebuildNotificationWithRemoteInput(entry, null /* remoteInputTest */,
+ return rebuildNotificationWithRemoteInputInserted(entry, null /* remoteInputTest */,
false /* showSpinner */, null /* mimeType */, null /* uri */);
}
@VisibleForTesting
- StatusBarNotification rebuildNotificationWithRemoteInput(NotificationEntry entry,
+ StatusBarNotification rebuildNotificationWithRemoteInputInserted(NotificationEntry entry,
CharSequence remoteInputText, boolean showSpinner, String mimeType, Uri uri) {
StatusBarNotification sbn = entry.getSbn();
@@ -746,7 +746,7 @@
}
String remoteInputMimeType = entry.remoteInputMimeType;
Uri remoteInputUri = entry.remoteInputUri;
- StatusBarNotification newSbn = rebuildNotificationWithRemoteInput(entry,
+ StatusBarNotification newSbn = rebuildNotificationWithRemoteInputInserted(entry,
remoteInputText, false /* showSpinner */, remoteInputMimeType,
remoteInputUri);
entry.onRemoteInputInserted();
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/PulseExpansionHandler.kt b/packages/SystemUI/src/com/android/systemui/statusbar/PulseExpansionHandler.kt
index 9765ace..b34bfad 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/PulseExpansionHandler.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/PulseExpansionHandler.kt
@@ -179,7 +179,10 @@
}
override fun onTouchEvent(event: MotionEvent): Boolean {
- if (!canHandleMotionEvent()) {
+ val finishExpanding = (event.action == MotionEvent.ACTION_CANCEL ||
+ event.action == MotionEvent.ACTION_UP) && isExpanding
+ if (!canHandleMotionEvent() && !finishExpanding) {
+ // We allow cancellations/finishing to still go through here to clean up the state
return false
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java
index 9f82152..96b0e78 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java
@@ -51,6 +51,7 @@
import android.service.notification.SnoozeCriterion;
import android.service.notification.StatusBarNotification;
import android.util.ArraySet;
+import android.view.ContentInfo;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
@@ -126,8 +127,12 @@
public int targetSdk;
private long lastFullScreenIntentLaunchTime = NOT_LAUNCHED_YET;
public CharSequence remoteInputText;
+ // Mimetype and Uri used to display the image in the notification *after* it has been sent.
public String remoteInputMimeType;
public Uri remoteInputUri;
+ // ContentInfo used to keep the attachment permission alive until RemoteInput is sent or
+ // cancelled.
+ public ContentInfo remoteInputAttachment;
private Notification.BubbleMetadata mBubbleMetadata;
private ShortcutInfo mShortcutInfo;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java
index 5ccb064..ba2f555 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java
@@ -77,7 +77,6 @@
import com.android.systemui.Dumpable;
import com.android.systemui.ExpandHelper;
import com.android.systemui.R;
-import com.android.systemui.animation.ActivityLaunchAnimator;
import com.android.systemui.animation.Interpolators;
import com.android.systemui.plugins.statusbar.NotificationSwipeActionHelper;
import com.android.systemui.statusbar.CommandQueue;
@@ -201,6 +200,7 @@
private int mPaddingBetweenElements;
private int mMaxTopPadding;
private int mTopPadding;
+ private boolean mAnimateNextTopPaddingChange;
private int mBottomMargin;
private int mBottomInset = 0;
private float mQsExpansionFraction;
@@ -1212,16 +1212,18 @@
@ShadeViewRefactor(RefactorComponent.SHADE_VIEW)
private void setTopPadding(int topPadding, boolean animate) {
if (mTopPadding != topPadding) {
+ boolean shouldAnimate = animate || mAnimateNextTopPaddingChange;
mTopPadding = topPadding;
updateAlgorithmHeightAndPadding();
updateContentHeight();
- if (animate && mAnimationsEnabled && mIsExpanded) {
+ if (shouldAnimate && mAnimationsEnabled && mIsExpanded) {
mTopPaddingNeedsAnimation = true;
mNeedsAnimation = true;
}
updateStackPosition();
requestChildrenUpdate();
- notifyHeightChangeListener(null, animate);
+ notifyHeightChangeListener(null, shouldAnimate);
+ mAnimateNextTopPaddingChange = false;
}
}
@@ -2071,6 +2073,9 @@
int scrollRange = Math.max(0, contentHeight - mMaxLayoutHeight);
int imeInset = getImeInset();
scrollRange += Math.min(imeInset, Math.max(0, contentHeight - (getHeight() - imeInset)));
+ if (scrollRange > 0) {
+ scrollRange = Math.max(getScrollAmountToScrollBoundary(), scrollRange);
+ }
return scrollRange;
}
@@ -5552,6 +5557,13 @@
}
/**
+ * Request an animation whenever the toppadding changes next
+ */
+ public void animateNextTopPaddingChange() {
+ mAnimateNextTopPaddingChange = true;
+ }
+
+ /**
* A listener that is notified when the empty space below the notifications is clicked on
*/
@ShadeViewRefactor(RefactorComponent.SHADE_VIEW)
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java
index e71f7db..09afedb 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java
@@ -1459,6 +1459,13 @@
}
/**
+ * Request an animation whenever the toppadding changes next
+ */
+ public void animateNextTopPaddingChange() {
+ mView.animateNextTopPaddingChange();
+ }
+
+ /**
* Enum for UiEvent logged from this class
*/
enum NotificationPanelEvent implements UiEventLogger.UiEventEnum {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java
index 8f4a71c..9ce9aa8 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java
@@ -420,8 +420,9 @@
// When pulsing (incoming notification on AOD), innerHeight is 0; clamp all
// to shelf start, thereby hiding all notifications (except the first one, which we
// later unhide in updatePulsingState)
- final int shelfStart = ambientState.getInnerHeight()
- - ambientState.getShelf().getIntrinsicHeight();
+ final int stackBottom = !ambientState.isShadeExpanded() || ambientState.isDozing()
+ ? ambientState.getInnerHeight() : (int) ambientState.getStackHeight();
+ final int shelfStart = stackBottom - ambientState.getShelf().getIntrinsicHeight();
viewState.yTranslation = Math.min(viewState.yTranslation, shelfStart);
if (viewState.yTranslation >= shelfStart) {
viewState.hidden = !view.isExpandAnimationRunning()
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardIndicationTextView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardIndicationTextView.java
index 96276f4..1789743 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardIndicationTextView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardIndicationTextView.java
@@ -38,7 +38,7 @@
* A view to show hints on Keyguard ("Swipe up to unlock", "Tap again to open").
*/
public class KeyguardIndicationTextView extends TextView {
- private static final long MSG_DURATION_MILLIS = 1500;
+ private static final long MSG_MIN_DURATION_MILLIS_DEFAULT = 1500;
private long mNextAnimationTime = 0;
private boolean mAnimationsEnabled = true;
private LinkedList<CharSequence> mMessages = new LinkedList<>();
@@ -104,8 +104,13 @@
long delay = Math.max(0, mNextAnimationTime - timeInMillis);
setNextAnimationTime(timeInMillis + delay + getFadeOutDuration());
+ final long minDurationMillis =
+ (indication != null && indication.getMinVisibilityMillis() != null)
+ ? indication.getMinVisibilityMillis()
+ : MSG_MIN_DURATION_MILLIS_DEFAULT;
+
if (!text.equals("") || hasIcon) {
- setNextAnimationTime(mNextAnimationTime + MSG_DURATION_MILLIS);
+ setNextAnimationTime(mNextAnimationTime + minDurationMillis);
animSetBuilder.before(getInAnimator());
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardLiftController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardLiftController.kt
index bfe0684..ec2d036 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardLiftController.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardLiftController.kt
@@ -53,7 +53,7 @@
// Not listening anymore since trigger events unregister themselves
isListening = false
updateListeningState()
- keyguardUpdateMonitor.requestFaceAuth()
+ keyguardUpdateMonitor.requestFaceAuth(true)
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java
index 5d31786..1a2b989 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java
@@ -557,6 +557,11 @@
private long mNotificationBoundsAnimationDelay;
/**
+ * The duration of the notification bounds animation
+ */
+ private long mNotificationBoundsAnimationDuration;
+
+ /**
* Is this a collapse that started on the panel where we should allow the panel to intercept
*/
private boolean mIsPanelCollapseOnQQS;
@@ -2038,7 +2043,7 @@
// When expanding QS, let's authenticate the user if possible,
// this will speed up notification actions.
if (height == 0) {
- mStatusBar.requestFaceAuth();
+ mStatusBar.requestFaceAuth(false);
}
}
@@ -2214,7 +2219,8 @@
private void onStackYChanged(boolean shouldAnimate) {
if (mQs != null) {
if (shouldAnimate) {
- mAnimateNextNotificationBounds = true;
+ animateNextNotificationBounds(StackStateAnimator.ANIMATION_DURATION_STANDARD,
+ 0 /* delay */);
mNotificationBoundsAnimationDelay = 0;
}
setQSClippingBounds();
@@ -2293,8 +2299,7 @@
final int startBottom = mKeyguardStatusAreaClipBounds.bottom;
mQsClippingAnimation = ValueAnimator.ofFloat(0.0f, 1.0f);
mQsClippingAnimation.setInterpolator(Interpolators.FAST_OUT_SLOW_IN);
- mQsClippingAnimation.setDuration(
- StackStateAnimator.ANIMATION_DURATION_GO_TO_FULL_SHADE);
+ mQsClippingAnimation.setDuration(mNotificationBoundsAnimationDuration);
mQsClippingAnimation.setStartDelay(mNotificationBoundsAnimationDelay);
mQsClippingAnimation.addUpdateListener(animation -> {
float fraction = animation.getAnimatedFraction();
@@ -2470,8 +2475,10 @@
* shade. 0.0f means we're not transitioning yet.
*/
public void setTransitionToFullShadeAmount(float pxAmount, boolean animate, long delay) {
- mAnimateNextNotificationBounds = animate && !mShouldUseSplitNotificationShade;
- mNotificationBoundsAnimationDelay = delay;
+ if (animate && !mShouldUseSplitNotificationShade) {
+ animateNextNotificationBounds(StackStateAnimator.ANIMATION_DURATION_GO_TO_FULL_SHADE,
+ delay);
+ }
float endPosition = 0;
if (pxAmount > 0.0f) {
@@ -3176,7 +3183,7 @@
case KEYGUARD:
if (!mDozingOnDown) {
if (mKeyguardBypassController.getBypassEnabled()) {
- mUpdateMonitor.requestFaceAuth();
+ mUpdateMonitor.requestFaceAuth(true);
} else {
mLockscreenGestureLogger.write(MetricsEvent.ACTION_LS_HINT,
0 /* lengthDp - N/A */, 0 /* velocityDp - N/A */);
@@ -3470,7 +3477,6 @@
mQs.setPanelView(mHeightListener);
mQs.setExpandClickListener(mOnClickListener);
mQs.setHeaderClickable(mQsExpansionEnabled);
- mQs.setTranslateWhileExpanding(mShouldUseSplitNotificationShade);
updateQSPulseExpansion();
mQs.setOverscrolling(mStackScrollerOverscrolling);
mQs.setTranslateWhileExpanding(mShouldUseSplitNotificationShade);
@@ -3484,6 +3490,13 @@
mHeightListener.onQsHeightChanged();
}
});
+ mQs.setCollapsedMediaVisibilityChangedListener((visible) -> {
+ if (mQs.getHeader().isShown()) {
+ animateNextNotificationBounds(StackStateAnimator.ANIMATION_DURATION_STANDARD,
+ 0 /* delay */);
+ mNotificationStackScrollLayoutController.animateNextTopPaddingChange();
+ }
+ });
mLockscreenShadeTransitionController.setQS(mQs);
mNotificationStackScrollLayoutController.setQsContainer((ViewGroup) mQs.getView());
updateQsExpansion();
@@ -3500,6 +3513,12 @@
}
};
+ private void animateNextNotificationBounds(long duration, long delay) {
+ mAnimateNextNotificationBounds = true;
+ mNotificationBoundsAnimationDuration = duration;
+ mNotificationBoundsAnimationDelay = delay;
+ }
+
@Override
public void setTouchAndAnimationDisabled(boolean disabled) {
super.setTouchAndAnimationDisabled(disabled);
@@ -3821,8 +3840,13 @@
expand(true /* animate */);
}
initDownStates(event);
- if (!mIsExpanding && !shouldQuickSettingsIntercept(mDownX, mDownY, 0)
- && mPulseExpansionHandler.onTouchEvent(event)) {
+
+ // If pulse is expanding already, let's give it the touch. There are situations
+ // where the panel starts expanding even though we're also pulsing
+ boolean pulseShouldGetTouch = (!mIsExpanding
+ && !shouldQuickSettingsIntercept(mDownX, mDownY, 0))
+ || mPulseExpansionHandler.isExpanding();
+ if (pulseShouldGetTouch && mPulseExpansionHandler.onTouchEvent(event)) {
// We're expanding all the other ones shouldn't get this anymore
return true;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
index 53394c3..61a0d63 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
@@ -1723,9 +1723,9 @@
/**
* Asks {@link KeyguardUpdateMonitor} to run face auth.
*/
- public void requestFaceAuth() {
+ public void requestFaceAuth(boolean userInitiatedRequest) {
if (!mKeyguardStateController.canDismissLockScreen()) {
- mKeyguardUpdateMonitor.requestFaceAuth();
+ mKeyguardUpdateMonitor.requestFaceAuth(userInitiatedRequest);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockedScreenOffAnimationController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockedScreenOffAnimationController.kt
index 9a04d39..6b00dd4 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockedScreenOffAnimationController.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockedScreenOffAnimationController.kt
@@ -57,7 +57,7 @@
private val lightRevealAnimator = ValueAnimator.ofFloat(1f, 0f).apply {
duration = LIGHT_REVEAL_ANIMATION_DURATION
- interpolator = Interpolators.FAST_OUT_SLOW_IN_REVERSE
+ interpolator = Interpolators.LINEAR
addUpdateListener { lightRevealScrim.revealAmount = it.animatedValue as Float }
addListener(object : AnimatorListenerAdapter() {
override fun onAnimationCancel(animation: Animator?) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallController.kt
index d5965ec..c20730e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallController.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallController.kt
@@ -25,6 +25,7 @@
import android.util.Log
import android.view.View
import android.widget.Chronometer
+import androidx.annotation.VisibleForTesting
import com.android.internal.jank.InteractionJankMonitor
import com.android.systemui.R
import com.android.systemui.animation.ActivityLaunchAnimator
@@ -122,6 +123,7 @@
* Should only be called from [CollapsedStatusBarFragment].
*/
fun setChipView(chipView: View) {
+ tearDownChipView()
this.chipView = chipView
if (hasOngoingCall()) {
updateChip()
@@ -165,8 +167,7 @@
val currentCallNotificationInfo = callNotificationInfo ?: return
val currentChipView = chipView
- val timeView =
- currentChipView?.findViewById<Chronometer>(R.id.ongoing_call_chip_time)
+ val timeView = currentChipView?.getTimeView()
val backgroundView =
currentChipView?.findViewById<View>(R.id.ongoing_call_chip_background)
@@ -248,12 +249,19 @@
private fun removeChip() {
callNotificationInfo = null
+ tearDownChipView()
mListeners.forEach { l -> l.onOngoingCallStateChanged(animate = true) }
if (uidObserver != null) {
iActivityManager.unregisterUidObserver(uidObserver)
}
}
+ /** Tear down anything related to the chip view to prevent leaks. */
+ @VisibleForTesting
+ fun tearDownChipView() = chipView?.getTimeView()?.stop()
+
+ private fun View.getTimeView(): Chronometer? = this.findViewById(R.id.ongoing_call_chip_time)
+
private data class CallNotificationInfo(
val key: String,
val callStartTime: Long,
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java
index e6c4e82..b18dfd2 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java
@@ -20,7 +20,6 @@
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
-import android.annotation.Nullable;
import android.app.ActivityManager;
import android.app.Notification;
import android.app.PendingIntent;
@@ -38,7 +37,6 @@
import android.graphics.drawable.GradientDrawable;
import android.net.Uri;
import android.os.Bundle;
-import android.os.ServiceManager;
import android.os.SystemClock;
import android.os.UserHandle;
import android.text.Editable;
@@ -72,13 +70,13 @@
import android.widget.TextView;
import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import com.android.internal.graphics.ColorUtils;
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.UiEvent;
import com.android.internal.logging.UiEventLogger;
import com.android.internal.logging.nano.MetricsProto;
-import com.android.internal.statusbar.IStatusBarService;
import com.android.internal.util.ContrastColorUtil;
import com.android.systemui.Dependency;
import com.android.systemui.R;
@@ -111,8 +109,8 @@
private final SendButtonTextWatcher mTextWatcher;
private final TextView.OnEditorActionListener mEditorActionHandler;
- private final NotificationRemoteInputManager mRemoteInputManager;
private final UiEventLogger mUiEventLogger;
+ private final RemoteInputQuickSettingsDisabler mRemoteInputQuickSettingsDisabler;
private final List<OnFocusChangeListener> mEditTextFocusChangeListeners = new ArrayList<>();
private final List<OnSendRemoteInputListener> mOnSendListeners = new ArrayList<>();
private RemoteEditText mEditText;
@@ -123,9 +121,6 @@
private RemoteInput[] mRemoteInputs;
private RemoteInput mRemoteInput;
private RemoteInputController mController;
- private RemoteInputQuickSettingsDisabler mRemoteInputQuickSettingsDisabler;
-
- private IStatusBarService mStatusBarManagerService;
private NotificationEntry mEntry;
@@ -134,7 +129,6 @@
private int mRevealCx;
private int mRevealCy;
private int mRevealR;
- private ContentInfo mAttachment;
private boolean mColorized;
private int mTint;
@@ -143,7 +137,6 @@
private NotificationViewWrapper mWrapper;
private Consumer<Boolean> mOnVisibilityChangedListener;
private NotificationRemoteInputManager.BouncerChecker mBouncerChecker;
- private LinearLayout mContentView;
private ImageView mDelete;
private ImageView mDeleteBg;
@@ -174,10 +167,7 @@
mTextWatcher = new SendButtonTextWatcher();
mEditorActionHandler = new EditorActionHandler();
mRemoteInputQuickSettingsDisabler = Dependency.get(RemoteInputQuickSettingsDisabler.class);
- mRemoteInputManager = Dependency.get(NotificationRemoteInputManager.class);
mUiEventLogger = Dependency.get(UiEventLogger.class);
- mStatusBarManagerService = IStatusBarService.Stub.asInterface(
- ServiceManager.getService(Context.STATUS_BAR_SERVICE));
TypedArray ta = getContext().getTheme().obtainStyledAttributes(new int[]{
com.android.internal.R.attr.colorAccent,
com.android.internal.R.attr.colorSurface,
@@ -266,8 +256,8 @@
mDeleteBg.setImageTintBlendMode(BlendMode.SRC_IN);
mDelete.setImageTintBlendMode(BlendMode.SRC_IN);
mDelete.setOnClickListener(v -> setAttachment(null));
- mContentView = findViewById(R.id.remote_input_content);
- mContentView.setBackground(mContentBackground);
+ LinearLayout contentView = findViewById(R.id.remote_input_content);
+ contentView.setBackground(mContentBackground);
mEditText = findViewById(R.id.remote_input_text);
mEditText.setInnerFocusable(false);
mEditText.setWindowInsetsAnimationCallback(
@@ -293,15 +283,19 @@
}
private void setAttachment(ContentInfo item) {
- if (mAttachment != null) {
+ if (mEntry.remoteInputAttachment != null && mEntry.remoteInputAttachment != item) {
// We need to release permissions when sending the attachment to the target
// app or if it is deleted by the user. When sending to the target app, we
// can safely release permissions as soon as the call to
// `mController.grantInlineReplyUriPermission` is made (ie, after the grant
// to the target app has been created).
- mAttachment.releasePermissions();
+ mEntry.remoteInputAttachment.releasePermissions();
}
- mAttachment = item;
+ mEntry.remoteInputAttachment = item;
+ if (item != null) {
+ mEntry.remoteInputUri = item.getClip().getItemAt(0).getUri();
+ mEntry.remoteInputMimeType = item.getClip().getDescription().getMimeType(0);
+ }
View attachment = findViewById(R.id.remote_input_content_container);
ImageView iconView = findViewById(R.id.remote_input_attachment_image);
iconView.setImageDrawable(null);
@@ -323,10 +317,9 @@
* @return returns intent with granted URI permissions that should be used immediately
*/
private Intent prepareRemoteInput() {
- if (mAttachment == null) return prepareRemoteInputFromText();
- return prepareRemoteInputFromData(
- mAttachment.getClip().getDescription().getMimeType(0),
- mAttachment.getClip().getItemAt(0).getUri());
+ return mEntry.remoteInputAttachment == null
+ ? prepareRemoteInputFromText()
+ : prepareRemoteInputFromData(mEntry.remoteInputMimeType, mEntry.remoteInputUri);
}
private Intent prepareRemoteInputFromText() {
@@ -337,7 +330,7 @@
results);
mEntry.remoteInputText = mEditText.getText().toString();
- // TODO(b/188646667): store attachment to entry
+ setAttachment(null);
mEntry.remoteInputUri = null;
mEntry.remoteInputMimeType = null;
@@ -363,7 +356,8 @@
RemoteInput.addResultsToIntent(mRemoteInputs, fillInIntent,
bundle);
- CharSequence attachmentText = mAttachment.getClip().getDescription().getLabel();
+ CharSequence attachmentText =
+ mEntry.remoteInputAttachment.getClip().getDescription().getLabel();
CharSequence attachmentLabel = TextUtils.isEmpty(attachmentText)
? mContext.getString(R.string.remote_input_image_insertion_text)
@@ -374,14 +368,11 @@
: "\"" + attachmentLabel + "\" " + mEditText.getText();
mEntry.remoteInputText = fullText;
- // TODO(b/188646667): store attachment to entry
- mEntry.remoteInputMimeType = contentType;
- mEntry.remoteInputUri = data;
// mirror prepareRemoteInputFromText for text input
if (mEntry.editedSuggestionInfo == null) {
RemoteInput.setResultsSource(fillInIntent, RemoteInput.SOURCE_FREE_FORM_INPUT);
- } else if (mAttachment == null) {
+ } else if (mEntry.remoteInputAttachment == null) {
RemoteInput.setResultsSource(fillInIntent, RemoteInput.SOURCE_CHOICE);
}
@@ -437,6 +428,7 @@
mEntry.getSbn().getUid(), mEntry.getSbn().getPackageName(),
mEntry.getSbn().getInstanceId());
}
+
setAttachment(null);
}
@@ -477,7 +469,6 @@
private void onDefocus(boolean animate, boolean logClose) {
mController.removeRemoteInput(mEntry, mToken);
mEntry.remoteInputText = mEditText.getText();
- // TODO(b/188646667): store attachment to entry
// During removal, we get reattached and lose focus. Not hiding in that
// case to prevent flicker.
@@ -565,7 +556,7 @@
mEntry.editedSuggestionInfo = editedSuggestionInfo;
if (editedSuggestionInfo != null) {
mEntry.remoteInputText = editedSuggestionInfo.originalText;
- // TODO(b/188646667): store attachment to entry
+ mEntry.remoteInputAttachment = null;
}
}
@@ -608,7 +599,7 @@
mEditText.setSelection(mEditText.length());
mEditText.requestFocus();
mController.addRemoteInput(mEntry, mToken);
- // TODO(b/188646667): restore attachment from entry
+ setAttachment(mEntry.remoteInputAttachment);
mRemoteInputQuickSettingsDisabler.setRemoteInputActive(true);
@@ -631,7 +622,6 @@
private void reset() {
mResetting = true;
mEntry.remoteInputTextWhenReset = SpannedString.valueOf(mEditText.getText());
- // TODO(b/188646667): store attachment at time of reset to entry
mEditText.getText().clear();
mEditText.setEnabled(true);
@@ -640,7 +630,7 @@
mController.removeSpinning(mEntry.getKey(), mToken);
updateSendButton();
onDefocus(false /* animate */, false /* logClose */);
- // TODO(b/188646667): clear attachment
+ setAttachment(null);
mResetting = false;
}
@@ -657,7 +647,7 @@
}
private void updateSendButton() {
- mSendButton.setEnabled(mEditText.length() != 0 || mAttachment != null);
+ mSendButton.setEnabled(mEditText.length() != 0 || mEntry.remoteInputAttachment != null);
}
public void close() {
@@ -857,7 +847,7 @@
&& event.getAction() == KeyEvent.ACTION_DOWN;
if (isSoftImeEvent || isKeyboardEnterKey) {
- if (mEditText.length() > 0 || mAttachment != null) {
+ if (mEditText.length() > 0 || mEntry.remoteInputAttachment != null) {
sendRemoteInput(prepareRemoteInput());
}
// Consume action to prevent IME from closing.
@@ -928,7 +918,6 @@
// our focus, so we'll need to save our text here.
if (mRemoteInputView != null) {
mRemoteInputView.mEntry.remoteInputText = getText();
- // TODO(b/188646667): store attachment to entry
}
}
return;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SecurityController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SecurityController.java
index e76b803..2a93844 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SecurityController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SecurityController.java
@@ -28,6 +28,8 @@
boolean isDeviceManaged();
boolean hasProfileOwner();
boolean hasWorkProfile();
+ /** Whether the work profile is turned on. */
+ boolean isWorkProfileOn();
/** Whether this device is organization-owned with a work profile **/
boolean isProfileOwnerOfOrganizationOwnedDevice();
String getDeviceOwnerName();
@@ -57,7 +59,6 @@
/** Label for admin */
CharSequence getLabel(DeviceAdminInfo info);
-
public interface SecurityControllerCallback {
void onStateChanged();
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SecurityControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SecurityControllerImpl.java
index 4afb86b..3e661df 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SecurityControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SecurityControllerImpl.java
@@ -211,6 +211,12 @@
}
@Override
+ public boolean isWorkProfileOn() {
+ final UserHandle userHandle = UserHandle.of(getWorkProfileUserId(mCurrentUserId));
+ return userHandle != null && !mUserManager.isQuietModeEnabled(userHandle);
+ }
+
+ @Override
public boolean isProfileOwnerOfOrganizationOwnedDevice() {
return mDevicePolicyManager.isOrganizationOwnedDeviceWithManagedProfile();
}
diff --git a/packages/SystemUI/src/com/android/systemui/wallet/controller/QuickAccessWalletController.java b/packages/SystemUI/src/com/android/systemui/wallet/controller/QuickAccessWalletController.java
index 65f236b..a262bf1 100644
--- a/packages/SystemUI/src/com/android/systemui/wallet/controller/QuickAccessWalletController.java
+++ b/packages/SystemUI/src/com/android/systemui/wallet/controller/QuickAccessWalletController.java
@@ -25,10 +25,11 @@
import android.service.quickaccesswallet.GetWalletCardsRequest;
import android.service.quickaccesswallet.QuickAccessWalletClient;
import android.service.quickaccesswallet.QuickAccessWalletClientImpl;
+import android.util.Log;
import com.android.systemui.R;
import com.android.systemui.dagger.SysUISingleton;
-import com.android.systemui.dagger.qualifiers.Main;
+import com.android.systemui.dagger.qualifiers.Background;
import com.android.systemui.util.settings.SecureSettings;
import java.util.concurrent.Executor;
@@ -65,7 +66,7 @@
@Inject
public QuickAccessWalletController(
Context context,
- @Main Executor executor,
+ @Background Executor executor,
SecureSettings secureSettings,
QuickAccessWalletClient quickAccessWalletClient) {
mContext = context;
@@ -142,6 +143,10 @@
*/
public void queryWalletCards(
QuickAccessWalletClient.OnWalletCardsRetrievedCallback cardsRetriever) {
+ if (!mQuickAccessWalletClient.isWalletFeatureAvailable()) {
+ Log.d(TAG, "QuickAccessWallet feature is not available.");
+ return;
+ }
int cardWidth =
mContext.getResources().getDimensionPixelSize(R.dimen.wallet_tile_card_view_width);
int cardHeight =
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java
index 657553f..fc0214a 100644
--- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java
+++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java
@@ -573,7 +573,7 @@
// Stop scanning when bouncer becomes visible
setKeyguardBouncerVisibility(true);
clearInvocations(mFaceManager);
- mKeyguardUpdateMonitor.requestFaceAuth();
+ mKeyguardUpdateMonitor.requestFaceAuth(true);
verify(mFaceManager, never()).authenticate(any(), any(), any(), any(), anyInt());
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java
index 8ab32bb..25722e1 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java
@@ -126,6 +126,8 @@
private ScreenLifecycle mScreenLifecycle;
@Mock
private Vibrator mVibrator;
+ @Mock
+ private UdfpsHapticsSimulator mUdfpsHapticsSimulator;
private FakeExecutor mFgExecutor;
@@ -188,6 +190,7 @@
mLockscreenShadeTransitionController,
mScreenLifecycle,
mVibrator,
+ mUdfpsHapticsSimulator,
Optional.of(mHbmProvider));
verify(mFingerprintManager).setUdfpsOverlayController(mOverlayCaptor.capture());
mOverlayController = mOverlayCaptor.getValue();
diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/MediaControlPanelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/MediaControlPanelTest.kt
index 2d19f7d..c9d4190 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/media/MediaControlPanelTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/media/MediaControlPanelTest.kt
@@ -232,6 +232,7 @@
emptyList(), PACKAGE, session.getSessionToken(), null, device, true, null)
player.bindPlayer(state, PACKAGE)
assertThat(seamlessText.getText()).isEqualTo(DEVICE_NAME)
+ assertThat(seamless.contentDescription).isEqualTo(DEVICE_NAME)
assertThat(seamless.isEnabled()).isTrue()
}
@@ -251,13 +252,15 @@
@Test
fun bindNullDevice() {
+ val fallbackString = context.getResources().getString(
+ com.android.internal.R.string.ext_media_seamless_action)
player.attachPlayer(holder)
val state = MediaData(USER_ID, true, BG_COLOR, APP, null, ARTIST, TITLE, null, emptyList(),
emptyList(), PACKAGE, session.getSessionToken(), null, null, true, null)
player.bindPlayer(state, PACKAGE)
assertThat(seamless.isEnabled()).isTrue()
- assertThat(seamlessText.getText()).isEqualTo(context.getResources().getString(
- com.android.internal.R.string.ext_media_seamless_action))
+ assertThat(seamlessText.getText()).isEqualTo(fallbackString)
+ assertThat(seamless.contentDescription).isEqualTo(fallbackString)
}
@Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/people/PeopleBackupFollowUpJobTest.java b/packages/SystemUI/tests/src/com/android/systemui/people/PeopleBackupFollowUpJobTest.java
new file mode 100644
index 0000000..00e012e
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/people/PeopleBackupFollowUpJobTest.java
@@ -0,0 +1,202 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.people;
+
+import static com.android.systemui.people.PeopleBackupFollowUpJob.SHARED_FOLLOW_UP;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.app.job.JobScheduler;
+import android.app.people.IPeopleManager;
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.net.Uri;
+import android.os.RemoteException;
+import android.preference.PreferenceManager;
+import android.testing.AndroidTestingRunner;
+
+import androidx.test.filters.SmallTest;
+
+import com.android.systemui.SysuiTestCase;
+import com.android.systemui.people.widget.PeopleTileKey;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import java.time.Duration;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+@RunWith(AndroidTestingRunner.class)
+@SmallTest
+public class PeopleBackupFollowUpJobTest extends SysuiTestCase {
+ private static final String SHORTCUT_ID_1 = "101";
+ private static final String PACKAGE_NAME_1 = "package_name";
+ private static final int USER_ID_1 = 0;
+
+ private static final PeopleTileKey PEOPLE_TILE_KEY =
+ new PeopleTileKey(SHORTCUT_ID_1, USER_ID_1, PACKAGE_NAME_1);
+
+ private static final String WIDGET_ID_STRING = "3";
+ private static final String SECOND_WIDGET_ID_STRING = "12";
+ private static final Set<String> WIDGET_IDS = new HashSet<>(
+ Arrays.asList(WIDGET_ID_STRING, SECOND_WIDGET_ID_STRING));
+
+ private static final Uri URI = Uri.parse("fake_uri");
+
+ @Mock
+ private PackageManager mPackageManager;
+ @Mock
+ private PackageInfo mPackageInfo;
+ @Mock
+ private IPeopleManager mIPeopleManager;
+ @Mock
+ private JobScheduler mJobScheduler;
+
+ private final SharedPreferences mSp = PreferenceManager.getDefaultSharedPreferences(mContext);
+ private final SharedPreferences.Editor mEditor = mSp.edit();
+ private final SharedPreferences mFollowUpSp = mContext.getSharedPreferences(
+ SHARED_FOLLOW_UP, Context.MODE_PRIVATE);
+ private final SharedPreferences.Editor mFollowUpEditor = mFollowUpSp.edit();
+ private final SharedPreferences mWidgetIdSp = mContext.getSharedPreferences(
+ WIDGET_ID_STRING, Context.MODE_PRIVATE);
+ private final SharedPreferences mSecondWidgetIdSp = mContext.getSharedPreferences(
+ SECOND_WIDGET_ID_STRING, Context.MODE_PRIVATE);
+
+ private PeopleBackupFollowUpJob mPeopleBackupFollowUpJob;
+
+ @Before
+ public void setUp() throws Exception {
+ MockitoAnnotations.initMocks(this);
+
+ when(mPackageManager.getPackageInfoAsUser(any(), anyInt(), anyInt()))
+ .thenReturn(mPackageInfo);
+ when(mIPeopleManager.isConversation(any(), anyInt(), any())).thenReturn(true);
+
+ mPeopleBackupFollowUpJob = new PeopleBackupFollowUpJob();
+ mPeopleBackupFollowUpJob.setManagers(
+ mContext, mPackageManager, mIPeopleManager, mJobScheduler);
+ }
+
+ @After
+ public void tearDown() {
+ mEditor.clear().commit();
+ mFollowUpEditor.clear().commit();
+ mWidgetIdSp.edit().clear().commit();
+ mSecondWidgetIdSp.edit().clear().commit();
+ }
+
+ @Test
+ public void testProcessFollowUpFile_shouldFollowUp() throws RemoteException {
+ when(mIPeopleManager.isConversation(any(), anyInt(), any())).thenReturn(false);
+ mFollowUpEditor.putStringSet(PEOPLE_TILE_KEY.toString(), WIDGET_IDS);
+ mFollowUpEditor.apply();
+
+ Map<String, Set<String>> remainingWidgets =
+ mPeopleBackupFollowUpJob.processFollowUpFile(mFollowUpSp, mFollowUpEditor);
+ mEditor.apply();
+ mFollowUpEditor.apply();
+
+ assertThat(remainingWidgets.size()).isEqualTo(1);
+ assertThat(remainingWidgets.get(PEOPLE_TILE_KEY.toString()))
+ .containsExactly(WIDGET_ID_STRING, SECOND_WIDGET_ID_STRING);
+ assertThat(mFollowUpSp.getStringSet(PEOPLE_TILE_KEY.toString(), new HashSet<>()))
+ .containsExactly(WIDGET_ID_STRING, SECOND_WIDGET_ID_STRING);
+ }
+
+ @Test
+ public void testProcessFollowUpFile_shouldRestore() {
+ mFollowUpEditor.putStringSet(PEOPLE_TILE_KEY.toString(), WIDGET_IDS);
+ mFollowUpEditor.apply();
+
+ Map<String, Set<String>> remainingWidgets =
+ mPeopleBackupFollowUpJob.processFollowUpFile(mFollowUpSp, mFollowUpEditor);
+ mEditor.apply();
+ mFollowUpEditor.apply();
+
+ assertThat(remainingWidgets).isEmpty();
+ assertThat(mFollowUpSp.getStringSet(PEOPLE_TILE_KEY.toString(), new HashSet<>())).isEmpty();
+ }
+
+ @Test
+ public void testShouldCancelJob_noRemainingWidgets_shouldCancel() {
+ assertThat(mPeopleBackupFollowUpJob.shouldCancelJob(
+ new HashMap<>(), 10, Duration.ofMinutes(1).toMillis())).isTrue();
+ }
+
+ @Test
+ public void testShouldCancelJob_noRemainingWidgets_longTimeElapsed_shouldCancel() {
+ assertThat(mPeopleBackupFollowUpJob.shouldCancelJob(
+ new HashMap<>(), 10, Duration.ofHours(25).toMillis())).isTrue();
+ }
+
+ @Test
+ public void testShouldCancelJob_remainingWidgets_shortTimeElapsed_shouldNotCancel() {
+ Map<String, Set<String>> remainingWidgets = new HashMap<>();
+ remainingWidgets.put(PEOPLE_TILE_KEY.toString(), WIDGET_IDS);
+ assertThat(mPeopleBackupFollowUpJob.shouldCancelJob(remainingWidgets, 10, 1000)).isFalse();
+ }
+
+ @Test
+ public void testShouldCancelJob_remainingWidgets_longTimeElapsed_shouldCancel() {
+ Map<String, Set<String>> remainingWidgets = new HashMap<>();
+ remainingWidgets.put(PEOPLE_TILE_KEY.toString(), WIDGET_IDS);
+ assertThat(mPeopleBackupFollowUpJob.shouldCancelJob(
+ remainingWidgets, 10, 1000 * 60 * 60 * 25)).isTrue();
+ }
+
+ @Test
+ public void testCancelJobAndClearRemainingWidgets() {
+ SharedPreferencesHelper.setPeopleTileKey(mWidgetIdSp, PEOPLE_TILE_KEY);
+ SharedPreferencesHelper.setPeopleTileKey(mSecondWidgetIdSp, PEOPLE_TILE_KEY);
+ mEditor.putStringSet(URI.toString(), WIDGET_IDS);
+ mEditor.putString(WIDGET_ID_STRING, URI.toString());
+ mEditor.putString(SECOND_WIDGET_ID_STRING, URI.toString());
+ mEditor.apply();
+ Map<String, Set<String>> remainingWidgets = new HashMap<>();
+ remainingWidgets.put(PEOPLE_TILE_KEY.toString(), WIDGET_IDS);
+
+ mPeopleBackupFollowUpJob.cancelJobAndClearRemainingWidgets(
+ remainingWidgets, mFollowUpEditor, mSp);
+ mEditor.apply();
+ mFollowUpEditor.apply();
+
+ verify(mJobScheduler, times(1)).cancel(anyInt());
+ assertThat(mFollowUpSp.getAll()).isEmpty();
+ assertThat(mWidgetIdSp.getAll()).isEmpty();
+ assertThat(mSecondWidgetIdSp.getAll()).isEmpty();
+ assertThat(mSp.getStringSet(PEOPLE_TILE_KEY.toString(), new HashSet<>())).isEmpty();
+ assertThat(mSp.getStringSet(URI.toString(), new HashSet<>())).isEmpty();
+ assertThat(mSp.getString(WIDGET_ID_STRING, null)).isNull();
+ assertThat(mSp.getString(SECOND_WIDGET_ID_STRING, null)).isNull();
+ }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/people/PeopleSpaceUtilsTest.java b/packages/SystemUI/tests/src/com/android/systemui/people/PeopleSpaceUtilsTest.java
index 33c7a57..fba1986 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/people/PeopleSpaceUtilsTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/people/PeopleSpaceUtilsTest.java
@@ -33,6 +33,7 @@
import android.app.INotificationManager;
import android.app.Notification;
import android.app.Person;
+import android.app.backup.BackupManager;
import android.app.people.IPeopleManager;
import android.app.people.PeopleSpaceTile;
import android.appwidget.AppWidgetManager;
@@ -198,6 +199,8 @@
private NotificationEntryManager mNotificationEntryManager;
@Mock
private PeopleSpaceWidgetManager mPeopleSpaceWidgetManager;
+ @Mock
+ private BackupManager mBackupManager;
private Bundle mOptions;
@@ -252,7 +255,7 @@
PeopleTileKey key = new PeopleTileKey(tile);
PeopleSpaceTile actual = PeopleSpaceUtils
.augmentTileFromNotification(mContext, tile, key, mNotificationEntry1, 0,
- Optional.empty());
+ Optional.empty(), mBackupManager);
assertThat(actual.getNotificationContent().toString()).isEqualTo(NOTIFICATION_TEXT_2);
assertThat(actual.getNotificationSender()).isEqualTo(null);
@@ -292,7 +295,7 @@
PeopleTileKey key = new PeopleTileKey(tile);
PeopleSpaceTile actual = PeopleSpaceUtils
.augmentTileFromNotification(mContext, tile, key, notificationEntry, 0,
- Optional.empty());
+ Optional.empty(), mBackupManager);
assertThat(actual.getNotificationContent().toString()).isEqualTo(NOTIFICATION_TEXT_2);
assertThat(actual.getNotificationSender().toString()).isEqualTo("name");
@@ -325,7 +328,7 @@
PeopleTileKey key = new PeopleTileKey(tile);
PeopleSpaceTile actual = PeopleSpaceUtils
.augmentTileFromNotification(mContext, tile, key, notificationEntry, 0,
- Optional.empty());
+ Optional.empty(), mBackupManager);
assertThat(actual.getNotificationContent().toString()).isEqualTo(NOTIFICATION_TEXT_1);
assertThat(actual.getNotificationDataUri()).isEqualTo(URI);
@@ -358,7 +361,7 @@
PeopleTileKey key = new PeopleTileKey(tile);
PeopleSpaceTile actual = PeopleSpaceUtils
.augmentTileFromNotification(mContext, tile, key, notificationEntry, 0,
- Optional.empty());
+ Optional.empty(), mBackupManager);
assertThat(actual.getNotificationContent().toString()).isEqualTo(NOTIFICATION_TEXT_1);
assertThat(actual.getNotificationDataUri()).isNull();
@@ -376,7 +379,7 @@
PeopleTileKey key = new PeopleTileKey(tile);
PeopleSpaceTile actual = PeopleSpaceUtils
.augmentTileFromNotification(mContext, tile, key, mNotificationEntry3, 0,
- Optional.empty());
+ Optional.empty(), mBackupManager);
assertThat(actual.getNotificationContent()).isEqualTo(null);
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/people/SharedPreferencesHelperTest.java b/packages/SystemUI/tests/src/com/android/systemui/people/SharedPreferencesHelperTest.java
new file mode 100644
index 0000000..7cd5e22
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/people/SharedPreferencesHelperTest.java
@@ -0,0 +1,100 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.systemui.people;
+
+import static com.android.systemui.people.PeopleSpaceUtils.INVALID_USER_ID;
+import static com.android.systemui.people.PeopleSpaceUtils.PACKAGE_NAME;
+import static com.android.systemui.people.PeopleSpaceUtils.SHORTCUT_ID;
+import static com.android.systemui.people.PeopleSpaceUtils.USER_ID;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.testing.AndroidTestingRunner;
+
+import androidx.test.filters.SmallTest;
+
+import com.android.systemui.SysuiTestCase;
+import com.android.systemui.people.widget.PeopleTileKey;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidTestingRunner.class)
+@SmallTest
+public class SharedPreferencesHelperTest extends SysuiTestCase {
+ private static final String SHORTCUT_ID_1 = "101";
+ private static final String PACKAGE_NAME_1 = "package_name";
+ private static final int USER_ID_1 = 0;
+
+ private static final PeopleTileKey PEOPLE_TILE_KEY =
+ new PeopleTileKey(SHORTCUT_ID_1, USER_ID_1, PACKAGE_NAME_1);
+
+ private static final int WIDGET_ID = 1;
+
+ private void setStorageForTile(PeopleTileKey peopleTileKey, int widgetId) {
+ SharedPreferences widgetSp = mContext.getSharedPreferences(
+ String.valueOf(widgetId),
+ Context.MODE_PRIVATE);
+ SharedPreferences.Editor widgetEditor = widgetSp.edit();
+ widgetEditor.putString(PeopleSpaceUtils.PACKAGE_NAME, peopleTileKey.getPackageName());
+ widgetEditor.putString(PeopleSpaceUtils.SHORTCUT_ID, peopleTileKey.getShortcutId());
+ widgetEditor.putInt(PeopleSpaceUtils.USER_ID, peopleTileKey.getUserId());
+ widgetEditor.apply();
+ }
+
+ @Test
+ public void testGetPeopleTileKey() {
+ setStorageForTile(PEOPLE_TILE_KEY, WIDGET_ID);
+
+ SharedPreferences sp = mContext.getSharedPreferences(
+ String.valueOf(WIDGET_ID),
+ Context.MODE_PRIVATE);
+ PeopleTileKey actual = SharedPreferencesHelper.getPeopleTileKey(sp);
+
+ assertThat(actual.getPackageName()).isEqualTo(PACKAGE_NAME_1);
+ assertThat(actual.getShortcutId()).isEqualTo(SHORTCUT_ID_1);
+ assertThat(actual.getUserId()).isEqualTo(USER_ID_1);
+ }
+
+ @Test
+ public void testSetPeopleTileKey() {
+ SharedPreferences sp = mContext.getSharedPreferences(
+ String.valueOf(WIDGET_ID),
+ Context.MODE_PRIVATE);
+ SharedPreferencesHelper.setPeopleTileKey(sp, PEOPLE_TILE_KEY);
+
+ assertThat(sp.getString(SHORTCUT_ID, null)).isEqualTo(SHORTCUT_ID_1);
+ assertThat(sp.getString(PACKAGE_NAME, null)).isEqualTo(PACKAGE_NAME_1);
+ assertThat(sp.getInt(USER_ID, INVALID_USER_ID)).isEqualTo(USER_ID_1);
+ }
+
+ @Test
+ public void testClear() {
+ setStorageForTile(PEOPLE_TILE_KEY, WIDGET_ID);
+
+ SharedPreferences sp = mContext.getSharedPreferences(
+ String.valueOf(WIDGET_ID),
+ Context.MODE_PRIVATE);
+ SharedPreferencesHelper.clear(sp);
+
+ assertThat(sp.getString(SHORTCUT_ID, null)).isEqualTo(null);
+ assertThat(sp.getString(PACKAGE_NAME, null)).isEqualTo(null);
+ assertThat(sp.getInt(USER_ID, INVALID_USER_ID)).isEqualTo(INVALID_USER_ID);
+
+ }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/people/widget/PeopleBackupHelperTest.java b/packages/SystemUI/tests/src/com/android/systemui/people/widget/PeopleBackupHelperTest.java
new file mode 100644
index 0000000..5d526e1
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/people/widget/PeopleBackupHelperTest.java
@@ -0,0 +1,537 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.systemui.people.widget;
+
+import static com.android.systemui.people.PeopleBackupFollowUpJob.SHARED_FOLLOW_UP;
+import static com.android.systemui.people.PeopleSpaceUtils.INVALID_USER_ID;
+import static com.android.systemui.people.widget.PeopleBackupHelper.ADD_USER_ID_TO_URI;
+import static com.android.systemui.people.widget.PeopleBackupHelper.SHARED_BACKUP;
+import static com.android.systemui.people.widget.PeopleBackupHelper.SharedFileEntryType;
+import static com.android.systemui.people.widget.PeopleBackupHelper.getEntryType;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.Mockito.when;
+
+import android.app.people.IPeopleManager;
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.os.RemoteException;
+import android.os.UserHandle;
+import android.preference.PreferenceManager;
+import android.testing.AndroidTestingRunner;
+
+import androidx.test.filters.SmallTest;
+
+import com.android.systemui.SysuiTestCase;
+import com.android.systemui.people.SharedPreferencesHelper;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import java.util.AbstractMap;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+@RunWith(AndroidTestingRunner.class)
+@SmallTest
+public class PeopleBackupHelperTest extends SysuiTestCase {
+ private static final String SHORTCUT_ID_1 = "101";
+ private static final String PACKAGE_NAME_1 = "package_name";
+ private static final int USER_ID_0 = 0;
+ private static final int USER_ID_10 = 10;
+
+ private static final PeopleTileKey PEOPLE_TILE_KEY =
+ new PeopleTileKey(SHORTCUT_ID_1, USER_ID_0, PACKAGE_NAME_1);
+ private static final PeopleTileKey OTHER_PEOPLE_TILE_KEY =
+ new PeopleTileKey(SHORTCUT_ID_1, USER_ID_10, PACKAGE_NAME_1);
+ private static final PeopleTileKey INVALID_USER_ID_PEOPLE_TILE_KEY =
+ new PeopleTileKey(SHORTCUT_ID_1, INVALID_USER_ID, PACKAGE_NAME_1);
+
+ private static final String WIDGET_ID_STRING = "3";
+ private static final String SECOND_WIDGET_ID_STRING = "12";
+ private static final String OTHER_WIDGET_ID_STRING = "7";
+ private static final Set<String> WIDGET_IDS = new HashSet<>(
+ Arrays.asList(WIDGET_ID_STRING, SECOND_WIDGET_ID_STRING));
+
+ private static final String URI_STRING = "content://mms";
+ private static final String URI_WITH_USER_ID_0 = "content://0@mms";
+ private static final String URI_WITH_USER_ID_10 = "content://10@mms";
+
+ private final SharedPreferences mBackupSp = mContext.getSharedPreferences(
+ SHARED_BACKUP, Context.MODE_PRIVATE);
+ private final SharedPreferences.Editor mBackupEditor = mBackupSp.edit();
+ private final SharedPreferences mSp = PreferenceManager.getDefaultSharedPreferences(mContext);
+ private final SharedPreferences.Editor mEditor = mSp.edit();
+ private final SharedPreferences mFollowUpSp = mContext.getSharedPreferences(
+ SHARED_FOLLOW_UP, Context.MODE_PRIVATE);
+ private final SharedPreferences.Editor mFollowUpEditor = mFollowUpSp.edit();
+ private final SharedPreferences mWidgetIdSp = mContext.getSharedPreferences(
+ WIDGET_ID_STRING, Context.MODE_PRIVATE);
+ private final SharedPreferences mSecondWidgetIdSp = mContext.getSharedPreferences(
+ SECOND_WIDGET_ID_STRING, Context.MODE_PRIVATE);
+
+ @Mock
+ private PackageManager mPackageManager;
+ @Mock
+ private PackageInfo mPackageInfo;
+ @Mock
+ private IPeopleManager mIPeopleManager;
+
+ private PeopleBackupHelper mHelper;
+ private PeopleBackupHelper mOtherHelper;
+
+ @Before
+ public void setUp() throws Exception {
+ MockitoAnnotations.initMocks(this);
+ mHelper = new PeopleBackupHelper(mContext,
+ UserHandle.of(0), new String[]{SHARED_BACKUP}, mPackageManager, mIPeopleManager);
+ mOtherHelper = new PeopleBackupHelper(mContext,
+ UserHandle.of(10), new String[]{SHARED_BACKUP}, mPackageManager, mIPeopleManager);
+
+ when(mPackageManager.getPackageInfoAsUser(any(), anyInt(), anyInt()))
+ .thenReturn(mPackageInfo);
+ when(mIPeopleManager.isConversation(any(), anyInt(), any())).thenReturn(true);
+ }
+
+ @After
+ public void tearDown() {
+ mBackupEditor.clear().commit();
+ mEditor.clear().commit();
+ mFollowUpEditor.clear().commit();
+ mWidgetIdSp.edit().clear().commit();
+ mSecondWidgetIdSp.edit().clear().commit();
+ }
+
+ @Test
+ public void testGetKeyType_widgetId() {
+ Map.Entry<String, ?> entry = new AbstractMap.SimpleEntry<>(WIDGET_ID_STRING, "contact");
+ assertThat(getEntryType(entry)).isEqualTo(SharedFileEntryType.WIDGET_ID);
+ }
+
+ @Test
+ public void testGetKeyType_widgetId_twoDigits() {
+ Map.Entry<String, ?> entry = new AbstractMap.SimpleEntry<>(
+ SECOND_WIDGET_ID_STRING, URI_STRING);
+ assertThat(getEntryType(entry)).isEqualTo(SharedFileEntryType.WIDGET_ID);
+ }
+
+ @Test
+ public void testGetKeyType_peopleTileKey_valid() {
+ Map.Entry<String, ?> entry = new AbstractMap.SimpleEntry<>(
+ "shortcut_id/12/com.android.systemui", WIDGET_IDS);
+ assertThat(getEntryType(entry)).isEqualTo(SharedFileEntryType.PEOPLE_TILE_KEY);
+ }
+
+ @Test
+ public void testGetKeyType_peopleTileKey_validWithSlashes() {
+ Map.Entry<String, ?> entry = new AbstractMap.SimpleEntry<>(
+ "shortcut_id/with/slashes/12/com.android.systemui2", WIDGET_IDS);
+ assertThat(getEntryType(entry)).isEqualTo(SharedFileEntryType.PEOPLE_TILE_KEY);
+ }
+
+ @Test
+ public void testGetKeyType_peopleTileKey_negativeNumber() {
+ Map.Entry<String, ?> entry = new AbstractMap.SimpleEntry<>(
+ "shortcut_id/with/slashes/-1/com.android.systemui2", WIDGET_IDS);
+ assertThat(getEntryType(entry)).isEqualTo(SharedFileEntryType.PEOPLE_TILE_KEY);
+ }
+
+ @Test
+ public void testGetKeyType_contactUri() {
+ Map.Entry<String, ?> entry = new AbstractMap.SimpleEntry<>(
+ "shortcut_id/1f/com.android.systemui2", WIDGET_IDS);
+ assertThat(getEntryType(entry)).isEqualTo(SharedFileEntryType.CONTACT_URI);
+ }
+
+ @Test
+ public void testGetKeyType_contactUri_valid() {
+ Map.Entry<String, ?> entry = new AbstractMap.SimpleEntry<>(
+ "http://content.fake", WIDGET_IDS);
+ assertThat(getEntryType(entry)).isEqualTo(SharedFileEntryType.CONTACT_URI);
+ }
+
+ @Test
+ public void testGetKeyType_contactUri_invalidPackageName() {
+ Map.Entry<String, ?> entry = new AbstractMap.SimpleEntry<>(
+ "shortcut_id/with/slashes/12/2r/com.android.systemui2", WIDGET_IDS);
+ assertThat(getEntryType(entry)).isEqualTo(SharedFileEntryType.CONTACT_URI);
+ }
+
+ @Test
+ public void testGetKeyType_unknown_unexpectedValueForPeopleTileKey() {
+ Map.Entry<String, ?> entry = new AbstractMap.SimpleEntry<>(
+ "shortcut_id/12/com.android.systemui", URI_STRING);
+ assertThat(getEntryType(entry)).isEqualTo(SharedFileEntryType.UNKNOWN);
+ }
+
+ @Test
+ public void testGetKeyType_unknown_unexpectedValueForContactUri() {
+ Map.Entry<String, ?> entry = new AbstractMap.SimpleEntry<>(
+ URI_STRING, "12");
+ assertThat(getEntryType(entry)).isEqualTo(SharedFileEntryType.UNKNOWN);
+ }
+
+ @Test
+ public void testGetKeyType_unknown() {
+ Map.Entry<String, ?> entry = new AbstractMap.SimpleEntry<>(
+ null, WIDGET_IDS);
+ assertThat(getEntryType(entry)).isEqualTo(SharedFileEntryType.UNKNOWN);
+ }
+
+ @Test
+ public void testBackupKey_widgetIdKey_containsWidget_noUserIdInUri() {
+ Map.Entry<String, ?> entry = new AbstractMap.SimpleEntry<>(WIDGET_ID_STRING, URI_STRING);
+
+ mHelper.backupKey(entry, mBackupEditor, Collections.singletonList(WIDGET_ID_STRING));
+ mBackupEditor.apply();
+
+ assertThat(mBackupSp.getString(WIDGET_ID_STRING, null)).isEqualTo(URI_STRING);
+ }
+
+ @Test
+ public void testBackupKey_widgetIdKey_doesNotContainWidget_noUserIdInUri() {
+ Map.Entry<String, ?> entry = new AbstractMap.SimpleEntry<>(WIDGET_ID_STRING, URI_STRING);
+
+ mHelper.backupKey(entry, mBackupEditor, Collections.singletonList(OTHER_WIDGET_ID_STRING));
+ mBackupEditor.apply();
+
+ assertThat(mBackupSp.getString(WIDGET_ID_STRING, null)).isNull();
+ }
+
+ @Test
+ public void testBackupKey_widgetIdKey_containsOneWidget_differentUserIdInUri() {
+ Map.Entry<String, ?> entry = new AbstractMap.SimpleEntry<>(WIDGET_ID_STRING,
+ URI_WITH_USER_ID_10);
+
+ mHelper.backupKey(entry, mBackupEditor, Collections.singletonList(WIDGET_ID_STRING));
+ mBackupEditor.apply();
+
+ assertThat(mBackupSp.getString(WIDGET_ID_STRING, null)).isEqualTo(URI_STRING);
+ assertThat(mBackupSp.getInt(ADD_USER_ID_TO_URI + WIDGET_ID_STRING, INVALID_USER_ID))
+ .isEqualTo(USER_ID_10);
+ }
+
+ @Test
+ public void testBackupKey_widgetIdKey_containsWidget_SameUserIdInUri() {
+ Map.Entry<String, ?> entry = new AbstractMap.SimpleEntry<>(
+ WIDGET_ID_STRING, URI_WITH_USER_ID_10);
+
+ mOtherHelper.backupKey(entry, mBackupEditor, Collections.singletonList(WIDGET_ID_STRING));
+ mBackupEditor.apply();
+
+ assertThat(mBackupSp.getString(WIDGET_ID_STRING, null)).isEqualTo(URI_STRING);
+ assertThat(mBackupSp.getInt(ADD_USER_ID_TO_URI + WIDGET_ID_STRING, INVALID_USER_ID))
+ .isEqualTo(USER_ID_10);
+ }
+
+ @Test
+ public void testBackupKey_contactUriKey_ignoresExistingWidgets() {
+ Map.Entry<String, ?> entry = new AbstractMap.SimpleEntry<>(URI_STRING, WIDGET_IDS);
+
+ mHelper.backupKey(entry, mBackupEditor, Collections.singletonList(WIDGET_ID_STRING));
+ mBackupEditor.apply();
+
+ assertThat(mBackupSp.getStringSet(URI_STRING, new HashSet<>()))
+ .containsExactly(WIDGET_ID_STRING, SECOND_WIDGET_ID_STRING);
+ }
+
+ @Test
+ public void testBackupKey_contactUriKey_ignoresExistingWidgets_otherWidget() {
+ Map.Entry<String, ?> entry = new AbstractMap.SimpleEntry<>(URI_STRING, WIDGET_IDS);
+
+ mHelper.backupKey(entry, mBackupEditor, Collections.singletonList(WIDGET_ID_STRING));
+ mBackupEditor.apply();
+
+ assertThat(mBackupSp.getStringSet(URI_STRING, new HashSet<>()))
+ .containsExactly(WIDGET_ID_STRING, SECOND_WIDGET_ID_STRING);
+ }
+
+ @Test
+ public void testBackupKey_contactUriKey_noUserId_otherUser_doesntBackup() {
+ Map.Entry<String, ?> entry = new AbstractMap.SimpleEntry<>(URI_STRING, WIDGET_IDS);
+
+ mOtherHelper.backupKey(entry, mBackupEditor, Collections.singletonList(WIDGET_ID_STRING));
+ mBackupEditor.apply();
+
+ assertThat(mBackupSp.getStringSet(URI_STRING, new HashSet<>())).isEmpty();
+ }
+
+ @Test
+ public void testBackupKey_contactUriKey_sameUserId() {
+ Map.Entry<String, ?> entry = new AbstractMap.SimpleEntry<>(URI_WITH_USER_ID_10, WIDGET_IDS);
+
+ mOtherHelper.backupKey(entry, mBackupEditor, Collections.singletonList(WIDGET_ID_STRING));
+ mBackupEditor.apply();
+
+ assertThat(mBackupSp.getStringSet(URI_STRING, new HashSet<>()))
+ .containsExactly(WIDGET_ID_STRING, SECOND_WIDGET_ID_STRING);
+ assertThat(mBackupSp.getInt(ADD_USER_ID_TO_URI + URI_STRING, INVALID_USER_ID))
+ .isEqualTo(USER_ID_10);
+ }
+
+ @Test
+ public void testBackupKey_contactUriKey_differentUserId_runningAsUser0() {
+ Map.Entry<String, ?> entry = new AbstractMap.SimpleEntry<>(URI_WITH_USER_ID_10, WIDGET_IDS);
+
+ mHelper.backupKey(entry, mBackupEditor, Collections.singletonList(WIDGET_ID_STRING));
+ mBackupEditor.apply();
+
+ assertThat(mBackupSp.getStringSet(URI_STRING, new HashSet<>())).isEmpty();
+ assertThat(mBackupSp.getInt(ADD_USER_ID_TO_URI + URI_STRING, INVALID_USER_ID))
+ .isEqualTo(INVALID_USER_ID);
+ }
+
+ @Test
+ public void testBackupKey_contactUriKey_differentUserId_runningAsUser10() {
+ Map.Entry<String, ?> entry = new AbstractMap.SimpleEntry<>(URI_WITH_USER_ID_0, WIDGET_IDS);
+
+ mOtherHelper.backupKey(entry, mBackupEditor, Collections.singletonList(WIDGET_ID_STRING));
+ mBackupEditor.apply();
+
+ assertThat(mBackupSp.getStringSet(URI_STRING, new HashSet<>())).isEmpty();
+ assertThat(mBackupSp.getInt(ADD_USER_ID_TO_URI + URI_STRING, INVALID_USER_ID))
+ .isEqualTo(INVALID_USER_ID);
+ }
+
+ @Test
+ public void testBackupKey_peopleTileKey_containsWidget() {
+ Map.Entry<String, ?> entry = new AbstractMap.SimpleEntry<>(
+ PEOPLE_TILE_KEY.toString(), WIDGET_IDS);
+
+ mHelper.backupKey(entry, mBackupEditor, Collections.singletonList(WIDGET_ID_STRING));
+ mBackupEditor.apply();
+
+ assertThat(mBackupSp.getStringSet(
+ INVALID_USER_ID_PEOPLE_TILE_KEY.toString(), new HashSet<>()))
+ .containsExactly(WIDGET_ID_STRING);
+ }
+
+ @Test
+ public void testBackupKey_peopleTileKey_containsBothWidgets() {
+ Map.Entry<String, ?> entry = new AbstractMap.SimpleEntry<>(
+ PEOPLE_TILE_KEY.toString(), WIDGET_IDS);
+
+ mHelper.backupKey(entry, mBackupEditor,
+ Arrays.asList(WIDGET_ID_STRING, SECOND_WIDGET_ID_STRING));
+ mBackupEditor.apply();
+
+ assertThat(
+ mBackupSp.getStringSet(INVALID_USER_ID_PEOPLE_TILE_KEY.toString(), new HashSet<>()))
+ .containsExactly(WIDGET_ID_STRING, SECOND_WIDGET_ID_STRING);
+ }
+
+ @Test
+ public void testBackupKey_peopleTileKey_doesNotContainWidget() {
+ Map.Entry<String, ?> entry = new AbstractMap.SimpleEntry<>(
+ PEOPLE_TILE_KEY.toString(), WIDGET_IDS);
+
+ mHelper.backupKey(entry, mBackupEditor, Collections.singletonList(OTHER_WIDGET_ID_STRING));
+ mBackupEditor.apply();
+
+ assertThat(mBackupSp.getStringSet(
+ INVALID_USER_ID_PEOPLE_TILE_KEY.toString(), new HashSet<>())).isEmpty();
+ }
+
+ @Test
+ public void testBackupKey_peopleTileKey_differentUserId() {
+ Map.Entry<String, ?> entry = new AbstractMap.SimpleEntry<>(
+ OTHER_PEOPLE_TILE_KEY.toString(), WIDGET_IDS);
+
+ mHelper.backupKey(entry, mBackupEditor, Collections.singletonList(WIDGET_ID_STRING));
+ mBackupEditor.apply();
+
+ assertThat(mBackupSp.getStringSet(
+ INVALID_USER_ID_PEOPLE_TILE_KEY.toString(), new HashSet<>())).isEmpty();
+ }
+
+ @Test
+ public void testRestoreKey_widgetIdKey_noUserIdInUri() {
+ Map.Entry<String, ?> entry = new AbstractMap.SimpleEntry<>(WIDGET_ID_STRING, URI_STRING);
+
+ boolean restored = mHelper.restoreKey(entry, mEditor, mFollowUpEditor, mBackupSp);
+ mEditor.apply();
+ mFollowUpEditor.apply();
+
+ assertThat(restored).isTrue();
+ assertThat(mSp.getString(WIDGET_ID_STRING, null)).isEqualTo(URI_STRING);
+ assertThat(mFollowUpSp.getAll()).isEmpty();
+ }
+
+ @Test
+ public void testRestoreKey_widgetIdKey_sameUserInUri() {
+ Map.Entry<String, ?> entry = new AbstractMap.SimpleEntry<>(WIDGET_ID_STRING, URI_STRING);
+ mBackupEditor.putInt(ADD_USER_ID_TO_URI + WIDGET_ID_STRING, USER_ID_0);
+ mBackupEditor.apply();
+
+ boolean restored = mHelper.restoreKey(entry, mEditor, mFollowUpEditor, mBackupSp);
+ mEditor.apply();
+ mFollowUpEditor.apply();
+
+ assertThat(restored).isTrue();
+ assertThat(mSp.getString(WIDGET_ID_STRING, null)).isEqualTo(URI_WITH_USER_ID_0);
+ assertThat(mFollowUpSp.getAll()).isEmpty();
+ }
+
+ @Test
+ public void testRestoreKey_widgetIdKey_differentUserInUri() {
+ Map.Entry<String, ?> entry = new AbstractMap.SimpleEntry<>(WIDGET_ID_STRING, URI_STRING);
+ mBackupEditor.putInt(ADD_USER_ID_TO_URI + WIDGET_ID_STRING, USER_ID_10);
+ mBackupEditor.apply();
+
+ boolean restored = mHelper.restoreKey(entry, mEditor, mFollowUpEditor, mBackupSp);
+ mEditor.apply();
+ mFollowUpEditor.apply();
+
+ assertThat(restored).isTrue();
+ assertThat(mSp.getString(WIDGET_ID_STRING, null)).isEqualTo(URI_WITH_USER_ID_10);
+ assertThat(mFollowUpSp.getAll()).isEmpty();
+ }
+
+ @Test
+ public void testRestoreKey_widgetIdKey_nonSystemUser_differentUser() {
+ Map.Entry<String, ?> entry = new AbstractMap.SimpleEntry<>(WIDGET_ID_STRING, URI_STRING);
+ mBackupEditor.putInt(ADD_USER_ID_TO_URI + WIDGET_ID_STRING, USER_ID_0);
+ mBackupEditor.apply();
+
+ boolean restored = mOtherHelper.restoreKey(entry, mEditor, mFollowUpEditor, mBackupSp);
+ mEditor.apply();
+ mFollowUpEditor.apply();
+
+ assertThat(restored).isTrue();
+ assertThat(mSp.getString(WIDGET_ID_STRING, null)).isEqualTo(URI_WITH_USER_ID_0);
+ assertThat(mFollowUpSp.getAll()).isEmpty();
+ }
+
+ @Test
+ public void testRestoreKey_contactUriKey_noUserIdInUri() {
+ Map.Entry<String, ?> entry = new AbstractMap.SimpleEntry<>(URI_STRING, WIDGET_IDS);
+
+ boolean restored = mHelper.restoreKey(entry, mEditor, mFollowUpEditor, mBackupSp);
+ mEditor.apply();
+ mFollowUpEditor.apply();
+
+ assertThat(restored).isTrue();
+ assertThat(mSp.getStringSet(URI_STRING, new HashSet<>()))
+ .containsExactly(WIDGET_ID_STRING, SECOND_WIDGET_ID_STRING);
+ assertThat(mFollowUpSp.getAll()).isEmpty();
+ }
+
+ @Test
+ public void testRestoreKey_contactUriKey_sameUserInUri() {
+ Map.Entry<String, ?> entry = new AbstractMap.SimpleEntry<>(URI_STRING, WIDGET_IDS);
+ mBackupEditor.putInt(ADD_USER_ID_TO_URI + URI_STRING, USER_ID_0);
+ mBackupEditor.apply();
+
+ boolean restored = mHelper.restoreKey(entry, mEditor, mFollowUpEditor, mBackupSp);
+ mEditor.apply();
+ mFollowUpEditor.apply();
+
+ assertThat(restored).isTrue();
+ assertThat(mSp.getStringSet(URI_WITH_USER_ID_0, new HashSet<>()))
+ .containsExactly(WIDGET_ID_STRING, SECOND_WIDGET_ID_STRING);
+ assertThat(mSp.getStringSet(URI_STRING, new HashSet<>())).isEmpty();
+ assertThat(mFollowUpSp.getAll()).isEmpty();
+ }
+
+ @Test
+ public void testRestoreKey_contactUriKey_differentUserInUri() {
+ Map.Entry<String, ?> entry = new AbstractMap.SimpleEntry<>(URI_STRING, WIDGET_IDS);
+ mBackupEditor.putInt(ADD_USER_ID_TO_URI + URI_STRING, USER_ID_10);
+ mBackupEditor.apply();
+
+ boolean restored = mHelper.restoreKey(entry, mEditor, mFollowUpEditor, mBackupSp);
+ mEditor.apply();
+ mFollowUpEditor.apply();
+
+ assertThat(restored).isTrue();
+ assertThat(mSp.getStringSet(URI_WITH_USER_ID_10, new HashSet<>()))
+ .containsExactly(WIDGET_ID_STRING, SECOND_WIDGET_ID_STRING);
+ assertThat(mSp.getStringSet(URI_STRING, new HashSet<>())).isEmpty();
+ assertThat(mFollowUpSp.getAll()).isEmpty();
+ }
+
+ @Test
+ public void testRestoreKey_contactUriKey_nonSystemUser_differentUser() {
+ Map.Entry<String, ?> entry = new AbstractMap.SimpleEntry<>(URI_STRING, WIDGET_IDS);
+ mBackupEditor.putInt(ADD_USER_ID_TO_URI + URI_STRING, USER_ID_0);
+ mBackupEditor.apply();
+
+ boolean restored = mOtherHelper.restoreKey(entry, mEditor, mFollowUpEditor, mBackupSp);
+ mEditor.apply();
+ mFollowUpEditor.apply();
+
+ assertThat(restored).isTrue();
+ assertThat(mSp.getStringSet(URI_WITH_USER_ID_0, new HashSet<>()))
+ .containsExactly(WIDGET_ID_STRING, SECOND_WIDGET_ID_STRING);
+ assertThat(mSp.getStringSet(URI_STRING, new HashSet<>())).isEmpty();
+ assertThat(mFollowUpSp.getAll()).isEmpty();
+ }
+
+ @Test
+ public void testRestoreKey_peopleTileKey_shouldNotFollowUp() {
+ Map.Entry<String, ?> entry = new AbstractMap.SimpleEntry<>(
+ INVALID_USER_ID_PEOPLE_TILE_KEY.toString(), WIDGET_IDS);
+
+ boolean restored = mHelper.restoreKey(entry, mEditor, mFollowUpEditor, mBackupSp);
+ mEditor.apply();
+ mFollowUpEditor.apply();
+
+ assertThat(restored).isTrue();
+ assertThat(mSp.getStringSet(PEOPLE_TILE_KEY.toString(), new HashSet<>()))
+ .containsExactly(WIDGET_ID_STRING, SECOND_WIDGET_ID_STRING);
+ assertThat(SharedPreferencesHelper.getPeopleTileKey(mWidgetIdSp))
+ .isEqualTo(PEOPLE_TILE_KEY);
+ assertThat(SharedPreferencesHelper.getPeopleTileKey(mSecondWidgetIdSp))
+ .isEqualTo(PEOPLE_TILE_KEY);
+ assertThat(mFollowUpSp.getAll()).isEmpty();
+ }
+
+ @Test
+ public void testRestoreKey_peopleTileKey_shortcutNotYetRestored_shouldFollowUpBoth()
+ throws RemoteException {
+ when(mIPeopleManager.isConversation(any(), anyInt(), any())).thenReturn(false);
+
+ Map.Entry<String, ?> entry = new AbstractMap.SimpleEntry<>(
+ INVALID_USER_ID_PEOPLE_TILE_KEY.toString(), WIDGET_IDS);
+
+ boolean restored = mHelper.restoreKey(entry, mEditor, mFollowUpEditor, mBackupSp);
+ mEditor.apply();
+ mFollowUpEditor.apply();
+
+ assertThat(restored).isFalse();
+ assertThat(mSp.getStringSet(PEOPLE_TILE_KEY.toString(), new HashSet<>()))
+ .containsExactly(WIDGET_ID_STRING, SECOND_WIDGET_ID_STRING);
+ assertThat(SharedPreferencesHelper.getPeopleTileKey(mWidgetIdSp))
+ .isEqualTo(PEOPLE_TILE_KEY);
+ assertThat(SharedPreferencesHelper.getPeopleTileKey(mSecondWidgetIdSp))
+ .isEqualTo(PEOPLE_TILE_KEY);
+
+ assertThat(mFollowUpSp.getStringSet(PEOPLE_TILE_KEY.toString(), new HashSet<>()))
+ .containsExactly(WIDGET_ID_STRING, SECOND_WIDGET_ID_STRING);
+ }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/people/widget/PeopleSpaceWidgetManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/people/widget/PeopleSpaceWidgetManagerTest.java
index c48f26b..ddad758 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/people/widget/PeopleSpaceWidgetManagerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/people/widget/PeopleSpaceWidgetManagerTest.java
@@ -73,6 +73,7 @@
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.Person;
+import android.app.backup.BackupManager;
import android.app.people.ConversationChannel;
import android.app.people.ConversationStatus;
import android.app.people.IPeopleManager;
@@ -102,7 +103,9 @@
import com.android.systemui.R;
import com.android.systemui.SysuiTestCase;
+import com.android.systemui.people.PeopleBackupFollowUpJob;
import com.android.systemui.people.PeopleSpaceUtils;
+import com.android.systemui.people.SharedPreferencesHelper;
import com.android.systemui.statusbar.NotificationListener;
import com.android.systemui.statusbar.NotificationListener.NotificationHandler;
import com.android.systemui.statusbar.SbnBuilder;
@@ -151,6 +154,11 @@
private static final int WIDGET_ID_WITH_KEY_IN_OPTIONS = 4;
private static final int WIDGET_ID_WITH_SAME_URI = 5;
private static final int WIDGET_ID_WITH_DIFFERENT_URI = 6;
+ private static final int WIDGET_ID_8 = 8;
+ private static final int WIDGET_ID_9 = 9;
+ private static final int WIDGET_ID_11 = 11;
+ private static final int WIDGET_ID_14 = 14;
+ private static final int WIDGET_ID_15 = 15;
private static final String SHORTCUT_ID = "101";
private static final String OTHER_SHORTCUT_ID = "102";
private static final String NOTIFICATION_KEY = "0|com.android.systemui.tests|0|null|0";
@@ -195,6 +203,14 @@
| SUPPRESSED_EFFECT_NOTIFICATION_LIST;
private static final long SBN_POST_TIME = 567L;
+ private static final Map<String, String> WIDGETS_MAPPING = Map.of(
+ String.valueOf(WIDGET_ID_8), String.valueOf(WIDGET_ID_WITH_SHORTCUT),
+ String.valueOf(WIDGET_ID_9), String.valueOf(WIDGET_ID_WITHOUT_SHORTCUT),
+ String.valueOf(WIDGET_ID_11), String.valueOf(WIDGET_ID_WITH_KEY_IN_OPTIONS),
+ String.valueOf(WIDGET_ID_14), String.valueOf(WIDGET_ID_WITH_SAME_URI),
+ String.valueOf(WIDGET_ID_15), String.valueOf(WIDGET_ID_WITH_DIFFERENT_URI)
+ );
+
private ShortcutInfo mShortcutInfo;
private NotificationEntry mNotificationEntry;
@@ -228,6 +244,8 @@
private NotificationManager.Policy mNotificationPolicy;
@Mock
private Bubbles mBubbles;
+ @Mock
+ private BackupManager mBackupManager;
@Captor
private ArgumentCaptor<NotificationHandler> mListenerCaptor;
@@ -246,8 +264,8 @@
mDependency.injectTestDependency(NotificationEntryManager.class, mNotificationEntryManager);
mManager = new PeopleSpaceWidgetManager(mContext, mAppWidgetManager, mIPeopleManager,
mPeopleManager, mLauncherApps, mNotificationEntryManager, mPackageManager,
- Optional.of(mBubbles), mUserManager, mINotificationManager, mNotificationManager,
- mFakeExecutor);
+ Optional.of(mBubbles), mUserManager, mBackupManager, mINotificationManager,
+ mNotificationManager, mFakeExecutor);
mManager.attach(mListenerService);
verify(mListenerService).addNotificationHandler(mListenerCaptor.capture());
@@ -1410,6 +1428,89 @@
assertThat(tile.getNotificationPolicyState()).isEqualTo(expected | SHOW_CONVERSATIONS);
}
+ @Test
+ public void testRemapWidgetFiles() {
+ setStorageForTile(SHORTCUT_ID, TEST_PACKAGE_A, WIDGET_ID_8, URI);
+ setStorageForTile(OTHER_SHORTCUT_ID, TEST_PACKAGE_B, WIDGET_ID_11, URI);
+
+ mManager.remapWidgetFiles(WIDGETS_MAPPING);
+
+ SharedPreferences sp1 = mContext.getSharedPreferences(
+ String.valueOf(WIDGET_ID_WITH_SHORTCUT), Context.MODE_PRIVATE);
+ PeopleTileKey key1 = SharedPreferencesHelper.getPeopleTileKey(sp1);
+ assertThat(key1.getShortcutId()).isEqualTo(SHORTCUT_ID);
+ assertThat(key1.getPackageName()).isEqualTo(TEST_PACKAGE_A);
+
+ SharedPreferences sp4 = mContext.getSharedPreferences(
+ String.valueOf(WIDGET_ID_WITH_KEY_IN_OPTIONS), Context.MODE_PRIVATE);
+ PeopleTileKey key4 = SharedPreferencesHelper.getPeopleTileKey(sp4);
+ assertThat(key4.getShortcutId()).isEqualTo(OTHER_SHORTCUT_ID);
+ assertThat(key4.getPackageName()).isEqualTo(TEST_PACKAGE_B);
+
+ SharedPreferences sp8 = mContext.getSharedPreferences(
+ String.valueOf(WIDGET_ID_8), Context.MODE_PRIVATE);
+ PeopleTileKey key8 = SharedPreferencesHelper.getPeopleTileKey(sp8);
+ assertThat(key8.getShortcutId()).isNull();
+ assertThat(key8.getPackageName()).isNull();
+
+ SharedPreferences sp11 = mContext.getSharedPreferences(
+ String.valueOf(WIDGET_ID_11), Context.MODE_PRIVATE);
+ PeopleTileKey key11 = SharedPreferencesHelper.getPeopleTileKey(sp11);
+ assertThat(key11.getShortcutId()).isNull();
+ assertThat(key11.getPackageName()).isNull();
+ }
+
+ @Test
+ public void testRemapSharedFile() {
+ setStorageForTile(SHORTCUT_ID, TEST_PACKAGE_A, WIDGET_ID_8, URI);
+ setStorageForTile(OTHER_SHORTCUT_ID, TEST_PACKAGE_B, WIDGET_ID_11, URI);
+
+ mManager.remapSharedFile(WIDGETS_MAPPING);
+
+ SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(mContext);
+
+ assertThat(sp.getString(String.valueOf(WIDGET_ID_8), null)).isNull();
+ assertThat(sp.getString(String.valueOf(WIDGET_ID_11), null)).isNull();
+ assertThat(sp.getString(String.valueOf(WIDGET_ID_WITH_SHORTCUT), null))
+ .isEqualTo(URI.toString());
+ assertThat(sp.getString(String.valueOf(WIDGET_ID_WITH_KEY_IN_OPTIONS), null))
+ .isEqualTo(URI.toString());
+
+ assertThat(sp.getStringSet(URI.toString(), new HashSet<>())).containsExactly(
+ String.valueOf(WIDGET_ID_WITH_SHORTCUT),
+ String.valueOf(WIDGET_ID_WITH_KEY_IN_OPTIONS));
+
+ PeopleTileKey key8 = new PeopleTileKey(SHORTCUT_ID, 0, TEST_PACKAGE_A);
+ assertThat(sp.getStringSet(key8.toString(), new HashSet<>())).containsExactly(
+ String.valueOf(WIDGET_ID_WITH_SHORTCUT));
+
+ PeopleTileKey key11 = new PeopleTileKey(OTHER_SHORTCUT_ID, 0, TEST_PACKAGE_B);
+ assertThat(sp.getStringSet(key11.toString(), new HashSet<>())).containsExactly(
+ String.valueOf(WIDGET_ID_WITH_KEY_IN_OPTIONS));
+ }
+
+ @Test
+ public void testRemapFollowupFile() {
+ PeopleTileKey key8 = new PeopleTileKey(SHORTCUT_ID, 0, TEST_PACKAGE_A);
+ PeopleTileKey key11 = new PeopleTileKey(OTHER_SHORTCUT_ID, 0, TEST_PACKAGE_B);
+ Set<String> set8 = new HashSet<>(Collections.singleton(String.valueOf(WIDGET_ID_8)));
+ Set<String> set11 = new HashSet<>(Collections.singleton(String.valueOf(WIDGET_ID_11)));
+
+ SharedPreferences followUp = mContext.getSharedPreferences(
+ PeopleBackupFollowUpJob.SHARED_FOLLOW_UP, Context.MODE_PRIVATE);
+ SharedPreferences.Editor followUpEditor = followUp.edit();
+ followUpEditor.putStringSet(key8.toString(), set8);
+ followUpEditor.putStringSet(key11.toString(), set11);
+ followUpEditor.apply();
+
+ mManager.remapFollowupFile(WIDGETS_MAPPING);
+
+ assertThat(followUp.getStringSet(key8.toString(), new HashSet<>())).containsExactly(
+ String.valueOf(WIDGET_ID_WITH_SHORTCUT));
+ assertThat(followUp.getStringSet(key11.toString(), new HashSet<>())).containsExactly(
+ String.valueOf(WIDGET_ID_WITH_KEY_IN_OPTIONS));
+ }
+
private void setFinalField(String fieldName, int value) {
try {
Field field = NotificationManager.Policy.class.getDeclaredField(fieldName);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerBaseTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerBaseTest.java
index 1f066d8..65e5f97 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerBaseTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerBaseTest.java
@@ -127,7 +127,7 @@
when(mQSPanel.getDumpableTag()).thenReturn("QSPanel");
when(mQSPanel.openPanelEvent()).thenReturn(QSEvent.QS_PANEL_EXPANDED);
when(mQSPanel.closePanelEvent()).thenReturn(QSEvent.QS_PANEL_COLLAPSED);
- when(mQSPanel.createRegularTileLayout()).thenReturn(mPagedTileLayout);
+ when(mQSPanel.getOrCreateTileLayout()).thenReturn(mPagedTileLayout);
when(mQSPanel.getTileLayout()).thenReturn(mPagedTileLayout);
when(mQSTile.getTileSpec()).thenReturn("dnd");
when(mQSTileHost.getTiles()).thenReturn(Collections.singleton(mQSTile));
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerTest.java
index 53eae8c..bf6c981 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerTest.java
@@ -107,7 +107,7 @@
when(mQSPanel.isAttachedToWindow()).thenReturn(true);
when(mQSPanel.getDumpableTag()).thenReturn("QSPanel");
- when(mQSPanel.createRegularTileLayout()).thenReturn(mPagedTileLayout);
+ when(mQSPanel.getOrCreateTileLayout()).thenReturn(mPagedTileLayout);
when(mQSPanel.getTileLayout()).thenReturn(mPagedTileLayout);
when(mQSTileHost.getTiles()).thenReturn(Collections.singleton(mQSTile));
when(mQSTileHost.createTileView(any(), eq(mQSTile), anyBoolean())).thenReturn(mQSTileView);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSSecurityFooterTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSSecurityFooterTest.java
index 7caf0dd..770cf2c 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSSecurityFooterTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSSecurityFooterTest.java
@@ -204,6 +204,8 @@
public void testTappableView_profileOwnerOfOrgOwnedDevice_networkLoggingEnabled() {
when(mSecurityController.isProfileOwnerOfOrganizationOwnedDevice()).thenReturn(true);
when(mSecurityController.isNetworkLoggingEnabled()).thenReturn(true);
+ when(mSecurityController.isWorkProfileOn()).thenReturn(true);
+ when(mSecurityController.hasWorkProfile()).thenReturn(true);
mFooter.refreshState();
@@ -213,6 +215,19 @@
}
@Test
+ public void testUntappableView_profileOwnerOfOrgOwnedDevice_workProfileOff() {
+ when(mSecurityController.isProfileOwnerOfOrganizationOwnedDevice()).thenReturn(true);
+ when(mSecurityController.isNetworkLoggingEnabled()).thenReturn(true);
+ when(mSecurityController.isWorkProfileOn()).thenReturn(false);
+
+ mFooter.refreshState();
+
+ TestableLooper.get(this).processAllMessages();
+ assertFalse(mRootView.isClickable());
+ assertEquals(View.GONE, mRootView.findViewById(R.id.footer_icon).getVisibility());
+ }
+
+ @Test
public void testNetworkLoggingEnabled_deviceOwner() {
when(mSecurityController.isDeviceManaged()).thenReturn(true);
when(mSecurityController.isNetworkLoggingEnabled()).thenReturn(true);
@@ -237,9 +252,10 @@
}
@Test
- public void testNetworkLoggingEnabled_managedProfileOwner() {
+ public void testNetworkLoggingEnabled_managedProfileOwner_workProfileOn() {
when(mSecurityController.hasWorkProfile()).thenReturn(true);
when(mSecurityController.isNetworkLoggingEnabled()).thenReturn(true);
+ when(mSecurityController.isWorkProfileOn()).thenReturn(true);
mFooter.refreshState();
TestableLooper.get(this).processAllMessages();
@@ -249,6 +265,17 @@
}
@Test
+ public void testNetworkLoggingEnabled_managedProfileOwner_workProfileOff() {
+ when(mSecurityController.hasWorkProfile()).thenReturn(true);
+ when(mSecurityController.isNetworkLoggingEnabled()).thenReturn(true);
+ when(mSecurityController.isWorkProfileOn()).thenReturn(false);
+ mFooter.refreshState();
+
+ TestableLooper.get(this).processAllMessages();
+ assertEquals("", mFooterText.getText());
+ }
+
+ @Test
public void testManagedCACertsInstalled() {
when(mSecurityController.isDeviceManaged()).thenReturn(true);
when(mSecurityController.hasCACertInCurrentUser()).thenReturn(true);
@@ -326,9 +353,10 @@
}
@Test
- public void testWorkProfileCACertsInstalled() {
+ public void testWorkProfileCACertsInstalled_workProfileOn() {
when(mSecurityController.isDeviceManaged()).thenReturn(false);
when(mSecurityController.hasCACertInWorkProfile()).thenReturn(true);
+ when(mSecurityController.isWorkProfileOn()).thenReturn(true);
mFooter.refreshState();
TestableLooper.get(this).processAllMessages();
@@ -350,6 +378,17 @@
}
@Test
+ public void testWorkProfileCACertsInstalled_workProfileOff() {
+ when(mSecurityController.isDeviceManaged()).thenReturn(false);
+ when(mSecurityController.hasCACertInWorkProfile()).thenReturn(true);
+ when(mSecurityController.isWorkProfileOn()).thenReturn(false);
+ mFooter.refreshState();
+
+ TestableLooper.get(this).processAllMessages();
+ assertEquals("", mFooterText.getText());
+ }
+
+ @Test
public void testCACertsInstalled() {
when(mSecurityController.isDeviceManaged()).thenReturn(false);
when(mSecurityController.hasCACertInCurrentUser()).thenReturn(true);
@@ -375,9 +414,10 @@
}
@Test
- public void testWorkProfileVpnEnabled() {
+ public void testWorkProfileVpnEnabled_workProfileOn() {
when(mSecurityController.isVpnEnabled()).thenReturn(true);
when(mSecurityController.getWorkProfileVpnName()).thenReturn(VPN_PACKAGE_2);
+ when(mSecurityController.isWorkProfileOn()).thenReturn(true);
mFooter.refreshState();
TestableLooper.get(this).processAllMessages();
@@ -389,6 +429,17 @@
}
@Test
+ public void testWorkProfileVpnEnabled_workProfileOff() {
+ when(mSecurityController.isVpnEnabled()).thenReturn(true);
+ when(mSecurityController.getWorkProfileVpnName()).thenReturn(VPN_PACKAGE_2);
+ when(mSecurityController.isWorkProfileOn()).thenReturn(false);
+ mFooter.refreshState();
+
+ TestableLooper.get(this).processAllMessages();
+ assertEquals("", mFooterText.getText());
+ }
+
+ @Test
public void testProfileOwnerOfOrganizationOwnedDeviceNoName() {
when(mSecurityController.isProfileOwnerOfOrganizationOwnedDevice()).thenReturn(true);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/QuickAccessWalletTileTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/QuickAccessWalletTileTest.java
index a50cbe5..b1e67f5 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/QuickAccessWalletTileTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/QuickAccessWalletTileTest.java
@@ -175,6 +175,15 @@
}
@Test
+ public void testWalletFeatureUnavailable_recreateWalletClient() {
+ when(mQuickAccessWalletClient.isWalletFeatureAvailable()).thenReturn(false);
+
+ mTile.handleSetListening(true);
+
+ verify(mController, times(1)).reCreateWalletClient();
+ }
+
+ @Test
public void testIsAvailable_qawFeatureAvailable() {
when(mPackageManager.hasSystemFeature(FEATURE_NFC_HOST_CARD_EMULATION)).thenReturn(true);
when(mPackageManager.hasSystemFeature("org.chromium.arc")).thenReturn(false);
@@ -267,6 +276,41 @@
}
@Test
+ public void testHandleUpdateState_walletIsUpdating() {
+ when(mKeyguardStateController.isUnlocked()).thenReturn(true);
+ QSTile.State state = new QSTile.State();
+ GetWalletCardsResponse response =
+ new GetWalletCardsResponse(
+ Collections.singletonList(createWalletCard(mContext)), 0);
+
+ mTile.handleSetListening(true);
+
+ verify(mController).queryWalletCards(mCallbackCaptor.capture());
+
+ // Wallet cards fetching on its way; wallet updating.
+ mTile.handleUpdateState(state, null);
+
+ assertEquals(Tile.STATE_INACTIVE, state.state);
+ assertEquals(
+ mContext.getString(R.string.wallet_secondary_label_updating), state.secondaryLabel);
+ assertNotNull(state.stateDescription);
+ assertNull(state.sideViewCustomDrawable);
+
+ // Wallet cards fetching completed.
+ mCallbackCaptor.getValue().onWalletCardsRetrieved(response);
+ mTestableLooper.processAllMessages();
+
+ mTile.handleUpdateState(state, null);
+
+ assertEquals(Tile.STATE_ACTIVE, state.state);
+ assertEquals(
+ "•••• 1234",
+ state.secondaryLabel);
+ assertNotNull(state.stateDescription);
+ assertNotNull(state.sideViewCustomDrawable);
+ }
+
+ @Test
public void testHandleUpdateState_hasCard_deviceLocked_tileInactive() {
when(mKeyguardStateController.isUnlocked()).thenReturn(false);
QSTile.State state = new QSTile.State();
@@ -315,7 +359,7 @@
}
@Test
- public void testHandleUpdateState_qawFeatureUnavailable_tileUnavailable() {
+ public void testHandleUpdateState_qawServiceUnavailable_tileUnavailable() {
when(mQuickAccessWalletClient.isWalletServiceAvailable()).thenReturn(false);
QSTile.State state = new QSTile.State();
@@ -327,6 +371,18 @@
}
@Test
+ public void testHandleUpdateState_qawFeatureUnavailable_tileUnavailable() {
+ when(mQuickAccessWalletClient.isWalletFeatureAvailable()).thenReturn(false);
+ QSTile.State state = new QSTile.State();
+
+ mTile.handleUpdateState(state, null);
+
+ assertEquals(Tile.STATE_UNAVAILABLE, state.state);
+ assertNull(state.stateDescription);
+ assertNull(state.sideViewCustomDrawable);
+ }
+
+ @Test
public void testHandleSetListening_queryCards() {
mTile.handleSetListening(true);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationRemoteInputManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationRemoteInputManagerTest.java
index 35c92b6..8e949e7 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationRemoteInputManagerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationRemoteInputManagerTest.java
@@ -161,7 +161,7 @@
String mimeType = "image/jpeg";
String text = "image inserted";
StatusBarNotification newSbn =
- mRemoteInputManager.rebuildNotificationWithRemoteInput(
+ mRemoteInputManager.rebuildNotificationWithRemoteInputInserted(
mEntry, text, false, mimeType, uri);
RemoteInputHistoryItem[] messages = (RemoteInputHistoryItem[]) newSbn.getNotification()
.extras.getParcelableArray(Notification.EXTRA_REMOTE_INPUT_HISTORY_ITEMS);
@@ -174,7 +174,7 @@
@Test
public void testRebuildWithRemoteInput_noExistingInputNoSpinner() {
StatusBarNotification newSbn =
- mRemoteInputManager.rebuildNotificationWithRemoteInput(
+ mRemoteInputManager.rebuildNotificationWithRemoteInputInserted(
mEntry, "A Reply", false, null, null);
RemoteInputHistoryItem[] messages = (RemoteInputHistoryItem[]) newSbn.getNotification()
.extras.getParcelableArray(Notification.EXTRA_REMOTE_INPUT_HISTORY_ITEMS);
@@ -189,7 +189,7 @@
@Test
public void testRebuildWithRemoteInput_noExistingInputWithSpinner() {
StatusBarNotification newSbn =
- mRemoteInputManager.rebuildNotificationWithRemoteInput(
+ mRemoteInputManager.rebuildNotificationWithRemoteInputInserted(
mEntry, "A Reply", true, null, null);
RemoteInputHistoryItem[] messages = (RemoteInputHistoryItem[]) newSbn.getNotification()
.extras.getParcelableArray(Notification.EXTRA_REMOTE_INPUT_HISTORY_ITEMS);
@@ -205,14 +205,14 @@
public void testRebuildWithRemoteInput_withExistingInput() {
// Setup a notification entry with 1 remote input.
StatusBarNotification newSbn =
- mRemoteInputManager.rebuildNotificationWithRemoteInput(
+ mRemoteInputManager.rebuildNotificationWithRemoteInputInserted(
mEntry, "A Reply", false, null, null);
NotificationEntry entry = new NotificationEntryBuilder()
.setSbn(newSbn)
.build();
// Try rebuilding to add another reply.
- newSbn = mRemoteInputManager.rebuildNotificationWithRemoteInput(
+ newSbn = mRemoteInputManager.rebuildNotificationWithRemoteInputInserted(
entry, "Reply 2", true, null, null);
RemoteInputHistoryItem[] messages = (RemoteInputHistoryItem[]) newSbn.getNotification()
.extras.getParcelableArray(Notification.EXTRA_REMOTE_INPUT_HISTORY_ITEMS);
@@ -228,14 +228,14 @@
String mimeType = "image/jpeg";
String text = "image inserted";
StatusBarNotification newSbn =
- mRemoteInputManager.rebuildNotificationWithRemoteInput(
+ mRemoteInputManager.rebuildNotificationWithRemoteInputInserted(
mEntry, text, false, mimeType, uri);
NotificationEntry entry = new NotificationEntryBuilder()
.setSbn(newSbn)
.build();
// Try rebuilding to add another reply.
- newSbn = mRemoteInputManager.rebuildNotificationWithRemoteInput(
+ newSbn = mRemoteInputManager.rebuildNotificationWithRemoteInputInserted(
entry, "Reply 2", true, null, null);
RemoteInputHistoryItem[] messages = (RemoteInputHistoryItem[]) newSbn.getNotification()
.extras.getParcelableArray(Notification.EXTRA_REMOTE_INPUT_HISTORY_ITEMS);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallControllerTest.kt
index 94c9de0..c81d468 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallControllerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallControllerTest.kt
@@ -43,6 +43,7 @@
import com.android.systemui.util.mockito.any
import com.android.systemui.util.time.FakeSystemClock
import com.google.common.truth.Truth.assertThat
+import org.junit.After
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
@@ -117,6 +118,11 @@
.thenReturn(PROC_STATE_INVISIBLE)
}
+ @After
+ fun tearDown() {
+ controller.tearDownChipView()
+ }
+
@Test
fun onEntryUpdated_isOngoingCallNotif_listenerNotified() {
notifCollectionListener.onEntryUpdated(createOngoingCallNotifEntry())
diff --git a/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeSecurityController.java b/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeSecurityController.java
index 3640bcd..d5348dc 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeSecurityController.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeSecurityController.java
@@ -44,6 +44,11 @@
}
@Override
+ public boolean isWorkProfileOn() {
+ return false;
+ }
+
+ @Override
public boolean isProfileOwnerOfOrganizationOwnedDevice() {
return false;
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/wallet/controller/QuickAccessWalletControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/wallet/controller/QuickAccessWalletControllerTest.java
index 23abce0..ce0098e 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/wallet/controller/QuickAccessWalletControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/wallet/controller/QuickAccessWalletControllerTest.java
@@ -21,7 +21,9 @@
import static org.junit.Assert.assertNotSame;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -61,12 +63,10 @@
private ArgumentCaptor<GetWalletCardsRequest> mRequestCaptor;
private QuickAccessWalletController mController;
- private TestableLooper mTestableLooper;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
- mTestableLooper = TestableLooper.get(this);
when(mQuickAccessWalletClient.isWalletServiceAvailable()).thenReturn(true);
when(mQuickAccessWalletClient.isWalletFeatureAvailable()).thenReturn(true);
when(mQuickAccessWalletClient.isWalletFeatureAvailableWhenDeviceLocked()).thenReturn(true);
@@ -143,4 +143,13 @@
mContext.getResources().getDimensionPixelSize(R.dimen.wallet_tile_card_view_height),
request.getCardHeightPx());
}
+
+ @Test
+ public void queryWalletCards_walletFeatureNotAvailable_noQuery() {
+ when(mQuickAccessWalletClient.isWalletFeatureAvailable()).thenReturn(false);
+
+ mController.queryWalletCards(mCardsRetriever);
+
+ verify(mQuickAccessWalletClient, never()).getWalletCards(any(), any(), any());
+ }
}
diff --git a/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java b/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java
index 906edb3..9ff1b10 100644
--- a/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java
+++ b/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java
@@ -455,7 +455,7 @@
}, FgThread.getExecutor()).whenComplete(uncheckExceptions((association, err) -> {
if (err == null) {
- addAssociation(association);
+ addAssociation(association, userId);
} else {
Slog.e(LOG_TAG, "Failed to discover device(s)", err);
callback.onFailure("No devices found: " + err.getMessage());
@@ -646,7 +646,7 @@
} else {
return association;
}
- }));
+ }), userId);
restartBleScan();
}
@@ -664,7 +664,8 @@
android.Manifest.permission.ASSOCIATE_COMPANION_DEVICES, "createAssociation");
addAssociation(new Association(
- userId, macAddress, packageName, null, false, System.currentTimeMillis()));
+ userId, macAddress, packageName, null, false,
+ System.currentTimeMillis()), userId);
}
private void checkCanCallNotificationApi(String callingPackage) throws RemoteException {
@@ -738,9 +739,9 @@
return Binder.getCallingUid() == Process.SYSTEM_UID;
}
- void addAssociation(Association association) {
+ void addAssociation(Association association, int userId) {
updateSpecialAccessPermissionForAssociatedPackage(association);
- recordAssociation(association);
+ recordAssociation(association, userId);
}
void removeAssociation(int userId, String pkg, String deviceMacAddress) {
@@ -752,7 +753,7 @@
onAssociationPreRemove(association);
}
return notMatch;
- }));
+ }), userId);
restartBleScan();
}
@@ -944,13 +945,9 @@
}, getContext(), packageName, userId).recycleOnUse());
}
- private void recordAssociation(Association association) {
+ private void recordAssociation(Association association, int userId) {
Slog.i(LOG_TAG, "recordAssociation(" + association + ")");
- updateAssociations(associations -> CollectionUtils.add(associations, association));
- }
-
- private void updateAssociations(Function<Set<Association>, Set<Association>> update) {
- updateAssociations(update, getCallingUserId());
+ updateAssociations(associations -> CollectionUtils.add(associations, association), userId);
}
private void updateAssociations(Function<Set<Association>, Set<Association>> update,
@@ -1515,7 +1512,7 @@
String pkg = getNextArgRequired();
String address = getNextArgRequired();
addAssociation(new Association(userId, address, pkg, null, false,
- System.currentTimeMillis()));
+ System.currentTimeMillis()), userId);
}
break;
diff --git a/services/core/java/com/android/server/SensorPrivacyService.java b/services/core/java/com/android/server/SensorPrivacyService.java
index e753226..c07d669 100644
--- a/services/core/java/com/android/server/SensorPrivacyService.java
+++ b/services/core/java/com/android/server/SensorPrivacyService.java
@@ -28,7 +28,6 @@
import static android.app.AppOpsManager.OP_PHONE_CALL_CAMERA;
import static android.app.AppOpsManager.OP_PHONE_CALL_MICROPHONE;
import static android.app.AppOpsManager.OP_RECORD_AUDIO;
-import static android.app.AppOpsManager.OP_RECORD_AUDIO_HOTWORD;
import static android.content.Intent.EXTRA_PACKAGE_NAME;
import static android.content.Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS;
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
@@ -47,6 +46,7 @@
import android.app.ActivityOptions;
import android.app.ActivityTaskManager;
import android.app.AppOpsManager;
+import android.app.AppOpsManagerInternal;
import android.app.KeyguardManager;
import android.app.Notification;
import android.app.NotificationChannel;
@@ -163,6 +163,7 @@
private final ActivityManagerInternal mActivityManagerInternal;
private final ActivityTaskManager mActivityTaskManager;
private final AppOpsManager mAppOpsManager;
+ private final AppOpsManagerInternal mAppOpsManagerInternal;
private final TelephonyManager mTelephonyManager;
private final IBinder mAppOpsRestrictionToken = new Binder();
@@ -172,16 +173,18 @@
private EmergencyCallHelper mEmergencyCallHelper;
private KeyguardManager mKeyguardManager;
+ private int mCurrentUser = -1;
+
public SensorPrivacyService(Context context) {
super(context);
mContext = context;
mAppOpsManager = context.getSystemService(AppOpsManager.class);
+ mAppOpsManagerInternal = getLocalService(AppOpsManagerInternal.class);
mUserManagerInternal = getLocalService(UserManagerInternal.class);
mActivityManager = context.getSystemService(ActivityManager.class);
mActivityManagerInternal = getLocalService(ActivityManagerInternal.class);
mActivityTaskManager = context.getSystemService(ActivityTaskManager.class);
mTelephonyManager = context.getSystemService(TelephonyManager.class);
-
mSensorPrivacyServiceImpl = new SensorPrivacyServiceImpl();
}
@@ -201,6 +204,20 @@
}
}
+ @Override
+ public void onUserStarting(TargetUser user) {
+ if (mCurrentUser == -1) {
+ mCurrentUser = user.getUserIdentifier();
+ setGlobalRestriction();
+ }
+ }
+
+ @Override
+ public void onUserSwitching(TargetUser from, TargetUser to) {
+ mCurrentUser = to.getUserIdentifier();
+ setGlobalRestriction();
+ }
+
class SensorPrivacyServiceImpl extends ISensorPrivacyManager.Stub implements
AppOpsManager.OnOpNotedListener, AppOpsManager.OnOpStartedListener,
IBinder.DeathRecipient, UserManagerInternal.UserRestrictionsListener {
@@ -262,17 +279,6 @@
if (readPersistedSensorPrivacyStateLocked()) {
persistSensorPrivacyStateLocked();
}
-
- for (int i = 0; i < mIndividualEnabled.size(); i++) {
- int userId = mIndividualEnabled.keyAt(i);
- SparseBooleanArray userIndividualEnabled =
- mIndividualEnabled.valueAt(i);
- for (int j = 0; j < userIndividualEnabled.size(); j++) {
- int sensor = userIndividualEnabled.keyAt(j);
- boolean enabled = userIndividualEnabled.valueAt(j);
- setUserRestriction(userId, sensor, enabled);
- }
- }
}
int[] micAndCameraOps = new int[]{OP_RECORD_AUDIO, OP_PHONE_CALL_MICROPHONE,
@@ -1379,7 +1385,10 @@
SparseArray<RemoteCallbackList<ISensorPrivacyListener>> listenersForUser =
mIndividualSensorListeners.get(userId);
- setUserRestriction(userId, sensor, enabled);
+ setGlobalRestriction();
+ if (userId == mCurrentUser) {
+ setGlobalRestriction();
+ }
if (listenersForUser == null) {
return;
@@ -1408,16 +1417,18 @@
}
}
- private void setUserRestriction(int userId, int sensor, boolean enabled) {
- if (sensor == CAMERA) {
- mAppOpsManager.setUserRestrictionForUser(OP_CAMERA, enabled,
- mAppOpsRestrictionToken, null, userId);
- } else if (sensor == MICROPHONE) {
- mAppOpsManager.setUserRestrictionForUser(OP_RECORD_AUDIO, enabled,
- mAppOpsRestrictionToken, null, userId);
- mAppOpsManager.setUserRestrictionForUser(OP_RECORD_AUDIO_HOTWORD, enabled,
- mAppOpsRestrictionToken, null, userId);
- }
+ private void setGlobalRestriction() {
+ boolean camState =
+ mSensorPrivacyServiceImpl
+ .isIndividualSensorPrivacyEnabled(mCurrentUser, CAMERA);
+ boolean micState =
+ mSensorPrivacyServiceImpl
+ .isIndividualSensorPrivacyEnabled(mCurrentUser, MICROPHONE);
+
+ mAppOpsManagerInternal
+ .setGlobalRestriction(OP_CAMERA, camState, mAppOpsRestrictionToken);
+ mAppOpsManagerInternal
+ .setGlobalRestriction(OP_RECORD_AUDIO, micState, mAppOpsRestrictionToken);
}
private final class DeathRecipient implements IBinder.DeathRecipient {
@@ -1535,7 +1546,7 @@
}
private class EmergencyCallHelper {
- private OutogingEmergencyStateCallback mEmergencyStateCallback;
+ private OutgoingEmergencyStateCallback mEmergencyStateCallback;
private CallStateCallback mCallStateCallback;
private boolean mIsInEmergencyCall;
@@ -1544,7 +1555,7 @@
private Object mEmergencyStateLock = new Object();
EmergencyCallHelper() {
- mEmergencyStateCallback = new OutogingEmergencyStateCallback();
+ mEmergencyStateCallback = new OutgoingEmergencyStateCallback();
mCallStateCallback = new CallStateCallback();
mTelephonyManager.registerTelephonyCallback(FgThread.getExecutor(),
@@ -1559,7 +1570,7 @@
}
}
- private class OutogingEmergencyStateCallback extends TelephonyCallback implements
+ private class OutgoingEmergencyStateCallback extends TelephonyCallback implements
TelephonyCallback.OutgoingEmergencyCallListener {
@Override
public void onOutgoingEmergencyCall(EmergencyNumber placedEmergencyNumber,
diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java
index 89781d3..875ef37 100644
--- a/services/core/java/com/android/server/am/ActiveServices.java
+++ b/services/core/java/com/android/server/am/ActiveServices.java
@@ -36,6 +36,7 @@
import static android.os.PowerExemptionManager.REASON_DEVICE_DEMO_MODE;
import static android.os.PowerExemptionManager.REASON_DEVICE_OWNER;
import static android.os.PowerExemptionManager.REASON_FGS_BINDING;
+import static android.os.PowerExemptionManager.REASON_CURRENT_INPUT_METHOD;
import static android.os.PowerExemptionManager.REASON_INSTR_BACKGROUND_ACTIVITY_PERMISSION;
import static android.os.PowerExemptionManager.REASON_INSTR_BACKGROUND_FGS_PERMISSION;
import static android.os.PowerExemptionManager.REASON_OPT_OUT_REQUESTED;
@@ -328,23 +329,11 @@
* Watch for apps being put into forced app standby, so we can step their fg
* services down.
*/
- class ForcedStandbyListener implements AppStateTracker.ForcedAppStandbyListener {
+ class ForcedStandbyListener implements AppStateTracker.ServiceStateListener {
@Override
- public void updateForceAppStandbyForUidPackage(int uid, String packageName,
- boolean standby) {
+ public void stopForegroundServicesForUidPackage(final int uid, final String packageName) {
synchronized (mAm) {
- if (standby) {
- stopAllForegroundServicesLocked(uid, packageName);
- }
- mAm.mProcessList.updateForceAppStandbyForUidPackageLocked(
- uid, packageName, standby);
- }
- }
-
- @Override
- public void updateForcedAppStandbyForAllApps() {
- synchronized (mAm) {
- mAm.mProcessList.updateForcedAppStandbyForAllAppsLocked();
+ stopAllForegroundServicesLocked(uid, packageName);
}
}
}
@@ -530,7 +519,7 @@
void systemServicesReady() {
AppStateTracker ast = LocalServices.getService(AppStateTracker.class);
- ast.addForcedAppStandbyListener(new ForcedStandbyListener());
+ ast.addServiceStateListener(new ForcedStandbyListener());
mAppWidgetManagerInternal = LocalServices.getService(AppWidgetManagerInternal.class);
setAllowListWhileInUsePermissionInFgs();
}
@@ -6174,6 +6163,20 @@
ret = REASON_OP_ACTIVATE_PLATFORM_VPN;
}
}
+
+ if (ret == REASON_DENIED) {
+ final String inputMethod =
+ Settings.Secure.getStringForUser(mAm.mContext.getContentResolver(),
+ Settings.Secure.DEFAULT_INPUT_METHOD,
+ UserHandle.getUserId(callingUid));
+ if (inputMethod != null) {
+ final ComponentName cn = ComponentName.unflattenFromString(inputMethod);
+ if (cn != null && cn.getPackageName().equals(callingPackage)) {
+ ret = REASON_CURRENT_INPUT_METHOD;
+ }
+ }
+ }
+
if (ret == REASON_DENIED) {
if (mAm.mConstants.mFgsAllowOptOut
&& targetService != null
diff --git a/services/core/java/com/android/server/am/ActivityManagerConstants.java b/services/core/java/com/android/server/am/ActivityManagerConstants.java
index 445d0ba..530f918 100644
--- a/services/core/java/com/android/server/am/ActivityManagerConstants.java
+++ b/services/core/java/com/android/server/am/ActivityManagerConstants.java
@@ -52,8 +52,7 @@
private static final String TAG = "ActivityManagerConstants";
// Key names stored in the settings value.
- static final String KEY_BACKGROUND_SETTLE_TIME = "background_settle_time";
-
+ private static final String KEY_BACKGROUND_SETTLE_TIME = "background_settle_time";
private static final String KEY_FGSERVICE_MIN_SHOWN_TIME
= "fgservice_min_shown_time";
private static final String KEY_FGSERVICE_MIN_REPORT_TIME
@@ -109,10 +108,10 @@
static final String KEY_FG_TO_BG_FGS_GRACE_DURATION = "fg_to_bg_fgs_grace_duration";
static final String KEY_FGS_START_FOREGROUND_TIMEOUT = "fgs_start_foreground_timeout";
static final String KEY_FGS_ATOM_SAMPLE_RATE = "fgs_atom_sample_rate";
- static final String KEY_KILL_FAS_CACHED_IDLE = "kill_fas_cached_idle";
static final String KEY_FGS_ALLOW_OPT_OUT = "fgs_allow_opt_out";
private static final int DEFAULT_MAX_CACHED_PROCESSES = 32;
+ private static final long DEFAULT_BACKGROUND_SETTLE_TIME = 60*1000;
private static final long DEFAULT_FGSERVICE_MIN_SHOWN_TIME = 2*1000;
private static final long DEFAULT_FGSERVICE_MIN_REPORT_TIME = 3*1000;
private static final long DEFAULT_FGSERVICE_SCREEN_ON_BEFORE_TIME = 1*1000;
@@ -153,10 +152,6 @@
private static final long DEFAULT_FG_TO_BG_FGS_GRACE_DURATION = 5 * 1000;
private static final int DEFAULT_FGS_START_FOREGROUND_TIMEOUT_MS = 10 * 1000;
private static final float DEFAULT_FGS_ATOM_SAMPLE_RATE = 1; // 100 %
-
- static final long DEFAULT_BACKGROUND_SETTLE_TIME = 60 * 1000;
- static final boolean DEFAULT_KILL_FAS_CACHED_IDLE = true;
-
/**
* Same as {@link TEMPORARY_ALLOW_LIST_TYPE_FOREGROUND_SERVICE_NOT_ALLOWED}
*/
@@ -501,12 +496,6 @@
volatile float mFgsAtomSampleRate = DEFAULT_FGS_ATOM_SAMPLE_RATE;
/**
- * Whether or not to kill apps in force-app-standby state and it's cached, its UID state is
- * idle.
- */
- volatile boolean mKillForceAppStandByAndCachedIdle = DEFAULT_KILL_FAS_CACHED_IDLE;
-
- /**
* Whether to allow "opt-out" from the foreground service restrictions.
* (https://developer.android.com/about/versions/12/foreground-services)
*/
@@ -720,9 +709,6 @@
case KEY_FGS_ATOM_SAMPLE_RATE:
updateFgsAtomSamplePercent();
break;
- case KEY_KILL_FAS_CACHED_IDLE:
- updateKillFasCachedIdle();
- break;
case KEY_FGS_ALLOW_OPT_OUT:
updateFgsAllowOptOut();
break;
@@ -1065,13 +1051,6 @@
DEFAULT_FGS_ATOM_SAMPLE_RATE);
}
- private void updateKillFasCachedIdle() {
- mKillForceAppStandByAndCachedIdle = DeviceConfig.getBoolean(
- DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
- KEY_KILL_FAS_CACHED_IDLE,
- DEFAULT_KILL_FAS_CACHED_IDLE);
- }
-
private void updateFgsAllowOptOut() {
mFgsAllowOptOut = DeviceConfig.getBoolean(
DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index a04edc7..3b0a68c 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -14382,10 +14382,6 @@
final int capability = uidRec != null ? uidRec.getSetCapability() : 0;
final boolean ephemeral = uidRec != null ? uidRec.isEphemeral() : isEphemeralLocked(uid);
- if (uidRec != null && uidRec.isIdle() && (change & UidRecord.CHANGE_IDLE) != 0) {
- mProcessList.killAppIfForceStandbyAndCachedIdleLocked(uidRec);
- }
-
if (uidRec != null && !uidRec.isIdle() && (change & UidRecord.CHANGE_GONE) != 0) {
// If this uid is going away, and we haven't yet reported it is gone,
// then do so now.
diff --git a/services/core/java/com/android/server/am/OomAdjuster.java b/services/core/java/com/android/server/am/OomAdjuster.java
index aef402a..6cebf47 100644
--- a/services/core/java/com/android/server/am/OomAdjuster.java
+++ b/services/core/java/com/android/server/am/OomAdjuster.java
@@ -2835,8 +2835,6 @@
+ " target=" + state.getAdjTarget() + " capability=" + item.capability);
}
- mProcessList.killAppIfForceStandbyAndCachedIdleLocked(app);
-
return success;
}
diff --git a/services/core/java/com/android/server/am/ProcessList.java b/services/core/java/com/android/server/am/ProcessList.java
index 1b67679..7c5d09c 100644
--- a/services/core/java/com/android/server/am/ProcessList.java
+++ b/services/core/java/com/android/server/am/ProcessList.java
@@ -125,7 +125,6 @@
import com.android.internal.util.ArrayUtils;
import com.android.internal.util.FrameworkStatsLog;
import com.android.internal.util.MemInfoReader;
-import com.android.server.AppStateTracker;
import com.android.server.LocalServices;
import com.android.server.ServiceThread;
import com.android.server.SystemConfig;
@@ -2370,12 +2369,6 @@
allowlistedAppDataInfoMap = null;
}
- AppStateTracker ast = LocalServices.getService(AppStateTracker.class);
- if (ast != null) {
- app.mState.setForcedAppStandby(ast.isAppInForcedAppStandby(
- app.info.uid, app.info.packageName));
- }
-
final Process.ProcessStartResult startResult;
boolean regularZygote = false;
if (hostingRecord.usesWebviewZygote()) {
@@ -4698,10 +4691,10 @@
final ApplicationInfo ai = AppGlobals.getPackageManager()
.getApplicationInfo(packageName, STOCK_PM_FLAGS, app.userId);
if (ai != null) {
+ app.getThread().scheduleApplicationInfoChanged(ai);
if (ai.packageName.equals(app.info.packageName)) {
app.info = ai;
}
- app.getThread().scheduleApplicationInfoChanged(ai);
targetProcesses.add(app.getWindowProcessController());
}
} catch (RemoteException e) {
@@ -4712,7 +4705,8 @@
});
}
- mService.mActivityTaskManager.updateAssetConfiguration(targetProcesses, updateFrameworkRes);
+ mService.mActivityTaskManager.updateAssetConfiguration(
+ updateFrameworkRes ? null : targetProcesses);
}
@GuardedBy("mService")
@@ -5007,55 +5001,6 @@
return true;
}
- @GuardedBy("mService")
- void updateForceAppStandbyForUidPackageLocked(int uid, String packageName, boolean standby) {
- final UidRecord uidRec = getUidRecordLOSP(uid);
- if (uidRec != null) {
- uidRec.forEachProcess(app -> {
- if (TextUtils.equals(app.info.packageName, packageName)) {
- app.mState.setForcedAppStandby(standby);
- killAppIfForceStandbyAndCachedIdleLocked(app);
- }
- });
- }
- }
-
- @GuardedBy("mService")
- void updateForcedAppStandbyForAllAppsLocked() {
- if (!mService.mConstants.mKillForceAppStandByAndCachedIdle) {
- return;
- }
- final AppStateTracker ast = LocalServices.getService(AppStateTracker.class);
- for (int i = mLruProcesses.size() - 1; i >= 0; i--) {
- final ProcessRecord app = mLruProcesses.get(i);
- final boolean standby = ast.isAppInForcedAppStandby(
- app.info.uid, app.info.packageName);
- app.mState.setForcedAppStandby(standby);
- if (standby) {
- killAppIfForceStandbyAndCachedIdleLocked(app);
- }
- }
- }
-
- @GuardedBy("mService")
- void killAppIfForceStandbyAndCachedIdleLocked(ProcessRecord app) {
- final UidRecord uidRec = app.getUidRecord();
- if (mService.mConstants.mKillForceAppStandByAndCachedIdle
- && uidRec != null && uidRec.isIdle()
- && !app.mState.shouldNotKillOnForcedAppStandbyAndIdle()
- && app.isCached() && app.mState.isForcedAppStandby()) {
- app.killLocked("cached idle & forced-app-standby",
- ApplicationExitInfo.REASON_OTHER,
- ApplicationExitInfo.SUBREASON_CACHED_IDLE_FORCED_APP_STANDBY,
- true);
- }
- }
-
- @GuardedBy("mService")
- void killAppIfForceStandbyAndCachedIdleLocked(UidRecord uidRec) {
- uidRec.forEachProcess(app -> killAppIfForceStandbyAndCachedIdleLocked(app));
- }
-
/**
* Called by ActivityManagerService when a process died.
*/
diff --git a/services/core/java/com/android/server/am/ProcessStateRecord.java b/services/core/java/com/android/server/am/ProcessStateRecord.java
index 5dbd71a..c113bc2 100644
--- a/services/core/java/com/android/server/am/ProcessStateRecord.java
+++ b/services/core/java/com/android/server/am/ProcessStateRecord.java
@@ -302,12 +302,6 @@
private int mAllowStartFgsState = PROCESS_STATE_NONEXISTENT;
/**
- * Whether or not this process has been in forced-app-standby state.
- */
- @GuardedBy("mService")
- private boolean mForcedAppStandby;
-
- /**
* Debugging: primary thing impacting oom_adj.
*/
@GuardedBy("mService")
@@ -1126,16 +1120,6 @@
}
@GuardedBy("mService")
- void setForcedAppStandby(boolean standby) {
- mForcedAppStandby = standby;
- }
-
- @GuardedBy("mService")
- boolean isForcedAppStandby() {
- return mForcedAppStandby;
- }
-
- @GuardedBy("mService")
void updateLastInvisibleTime(boolean hasVisibleActivities) {
if (hasVisibleActivities) {
mLastInvisibleTime = Long.MAX_VALUE;
@@ -1203,8 +1187,7 @@
pw.print(" pendingUiClean="); pw.println(mApp.mProfile.hasPendingUiClean());
}
pw.print(prefix); pw.print("cached="); pw.print(mCached);
- pw.print(" empty="); pw.print(mEmpty);
- pw.print(" forcedAppStandby="); pw.println(mForcedAppStandby);
+ pw.print(" empty="); pw.println(mEmpty);
if (mServiceB) {
pw.print(prefix); pw.print("serviceb="); pw.print(mServiceB);
pw.print(" serviceHighRam="); pw.println(mServiceHighRam);
diff --git a/services/core/java/com/android/server/appop/AppOpsService.java b/services/core/java/com/android/server/appop/AppOpsService.java
index 0a5e2b6..e001b05 100644
--- a/services/core/java/com/android/server/appop/AppOpsService.java
+++ b/services/core/java/com/android/server/appop/AppOpsService.java
@@ -338,7 +338,14 @@
/*
* These are app op restrictions imposed per user from various parties.
*/
- private final ArrayMap<IBinder, ClientRestrictionState> mOpUserRestrictions = new ArrayMap<>();
+ private final ArrayMap<IBinder, ClientUserRestrictionState> mOpUserRestrictions =
+ new ArrayMap<>();
+
+ /*
+ * These are app op restrictions imposed globally from various parties within the system.
+ */
+ private final ArrayMap<IBinder, ClientGlobalRestrictionState> mOpGlobalRestrictions =
+ new ArrayMap<>();
SparseIntArray mProfileOwners;
@@ -2341,8 +2348,9 @@
boolean isCallerSystem = Binder.getCallingPid() == Process.myPid();
boolean isCallerPermissionController;
try {
- isCallerPermissionController = pm.getPackageUid(
- mContext.getPackageManager().getPermissionControllerPackageName(), 0)
+ isCallerPermissionController = pm.getPackageUidAsUser(
+ mContext.getPackageManager().getPermissionControllerPackageName(), 0,
+ UserHandle.getUserId(Binder.getCallingUid()))
== Binder.getCallingUid();
} catch (PackageManager.NameNotFoundException doesNotHappen) {
return;
@@ -4515,10 +4523,15 @@
int callingUid = Binder.getCallingUid();
// Allow any attribution tag for resolvable uids
- int pkgUid = resolveUid(packageName);
- if (pkgUid != Process.INVALID_UID) {
+ int pkgUid;
+ if (Objects.equals(packageName, "com.android.shell")) {
// Special case for the shell which is a package but should be able
// to bypass app attribution tag restrictions.
+ pkgUid = Process.SHELL_UID;
+ } else {
+ pkgUid = resolveUid(packageName);
+ }
+ if (pkgUid != Process.INVALID_UID) {
if (pkgUid != UserHandle.getAppId(uid)) {
String otherUidMessage = DEBUG ? " but it is really " + pkgUid : " but it is not";
throw new SecurityException("Specified package " + packageName + " under uid "
@@ -4721,13 +4734,22 @@
private boolean isOpRestrictedLocked(int uid, int code, String packageName,
String attributionTag, @Nullable RestrictionBypass appBypass) {
+ int restrictionSetCount = mOpGlobalRestrictions.size();
+
+ for (int i = 0; i < restrictionSetCount; i++) {
+ ClientGlobalRestrictionState restrictionState = mOpGlobalRestrictions.valueAt(i);
+ if (restrictionState.hasRestriction(code)) {
+ return true;
+ }
+ }
+
int userHandle = UserHandle.getUserId(uid);
- final int restrictionSetCount = mOpUserRestrictions.size();
+ restrictionSetCount = mOpUserRestrictions.size();
for (int i = 0; i < restrictionSetCount; i++) {
// For each client, check that the given op is not restricted, or that the given
// package is exempt from the restriction.
- ClientRestrictionState restrictionState = mOpUserRestrictions.valueAt(i);
+ ClientUserRestrictionState restrictionState = mOpUserRestrictions.valueAt(i);
if (restrictionState.hasRestriction(code, packageName, attributionTag, userHandle)) {
RestrictionBypass opBypass = opAllowSystemBypassRestriction(code);
if (opBypass != null) {
@@ -6294,10 +6316,31 @@
pw.println();
}
+ final int globalRestrictionCount = mOpGlobalRestrictions.size();
+ for (int i = 0; i < globalRestrictionCount; i++) {
+ IBinder token = mOpGlobalRestrictions.keyAt(i);
+ ClientGlobalRestrictionState restrictionState = mOpGlobalRestrictions.valueAt(i);
+ ArraySet<Integer> restrictedOps = restrictionState.mRestrictedOps;
+
+ pw.println(" Global restrictions for token " + token + ":");
+ StringBuilder restrictedOpsValue = new StringBuilder();
+ restrictedOpsValue.append("[");
+ final int restrictedOpCount = restrictedOps.size();
+ for (int j = 0; j < restrictedOpCount; j++) {
+ if (restrictedOpsValue.length() > 1) {
+ restrictedOpsValue.append(", ");
+ }
+ restrictedOpsValue.append(AppOpsManager.opToName(restrictedOps.valueAt(j)));
+ }
+ restrictedOpsValue.append("]");
+ pw.println(" Restricted ops: " + restrictedOpsValue);
+
+ }
+
final int userRestrictionCount = mOpUserRestrictions.size();
for (int i = 0; i < userRestrictionCount; i++) {
IBinder token = mOpUserRestrictions.keyAt(i);
- ClientRestrictionState restrictionState = mOpUserRestrictions.valueAt(i);
+ ClientUserRestrictionState restrictionState = mOpUserRestrictions.valueAt(i);
boolean printedTokenHeader = false;
if (dumpMode >= 0 || dumpWatchers || dumpHistory) {
@@ -6443,11 +6486,11 @@
private void setUserRestrictionNoCheck(int code, boolean restricted, IBinder token,
int userHandle, PackageTagsList excludedPackageTags) {
synchronized (AppOpsService.this) {
- ClientRestrictionState restrictionState = mOpUserRestrictions.get(token);
+ ClientUserRestrictionState restrictionState = mOpUserRestrictions.get(token);
if (restrictionState == null) {
try {
- restrictionState = new ClientRestrictionState(token);
+ restrictionState = new ClientUserRestrictionState(token);
} catch (RemoteException e) {
return;
}
@@ -6527,7 +6570,7 @@
synchronized (AppOpsService.this) {
final int tokenCount = mOpUserRestrictions.size();
for (int i = tokenCount - 1; i >= 0; i--) {
- ClientRestrictionState opRestrictions = mOpUserRestrictions.valueAt(i);
+ ClientUserRestrictionState opRestrictions = mOpUserRestrictions.valueAt(i);
opRestrictions.removeUser(userHandle);
}
removeUidsForUserLocked(userHandle);
@@ -6955,7 +6998,6 @@
return Process.ROOT_UID;
case "shell":
case "dumpstate":
- case "com.android.shell":
return Process.SHELL_UID;
case "media":
return Process.MEDIA_UID;
@@ -6985,12 +7027,12 @@
return packageNames;
}
- private final class ClientRestrictionState implements DeathRecipient {
+ private final class ClientUserRestrictionState implements DeathRecipient {
private final IBinder token;
SparseArray<boolean[]> perUserRestrictions;
SparseArray<PackageTagsList> perUserExcludedPackageTags;
- public ClientRestrictionState(IBinder token)
+ ClientUserRestrictionState(IBinder token)
throws RemoteException {
token.linkToDeath(this, 0);
this.token = token;
@@ -7081,6 +7123,7 @@
if (perUserExclusions == null) {
return true;
}
+
return !perUserExclusions.contains(packageName, attributionTag);
}
@@ -7142,6 +7185,42 @@
}
}
+ private final class ClientGlobalRestrictionState implements DeathRecipient {
+ final IBinder mToken;
+ final ArraySet<Integer> mRestrictedOps = new ArraySet<>();
+
+ ClientGlobalRestrictionState(IBinder token)
+ throws RemoteException {
+ token.linkToDeath(this, 0);
+ this.mToken = token;
+ }
+
+ boolean setRestriction(int code, boolean restricted) {
+ if (restricted) {
+ return mRestrictedOps.add(code);
+ } else {
+ return mRestrictedOps.remove(code);
+ }
+ }
+
+ boolean hasRestriction(int code) {
+ return mRestrictedOps.contains(code);
+ }
+
+ boolean isDefault() {
+ return mRestrictedOps.isEmpty();
+ }
+
+ @Override
+ public void binderDied() {
+ destroy();
+ }
+
+ void destroy() {
+ mToken.unlinkToDeath(this, 0);
+ }
+ }
+
private final class AppOpsManagerInternalImpl extends AppOpsManagerInternal {
@Override public void setDeviceAndProfileOwners(SparseIntArray owners) {
synchronized (AppOpsService.this) {
@@ -7166,6 +7245,42 @@
int mode, @Nullable IAppOpsCallback callback) {
setMode(code, uid, packageName, mode, callback);
}
+
+
+ @Override
+ public void setGlobalRestriction(int code, boolean restricted, IBinder token) {
+ if (Binder.getCallingPid() != Process.myPid()) {
+ // TODO instead of this enforcement put in AppOpsManagerInternal
+ throw new SecurityException("Only the system can set global restrictions");
+ }
+
+ synchronized (AppOpsService.this) {
+ ClientGlobalRestrictionState restrictionState = mOpGlobalRestrictions.get(token);
+
+ if (restrictionState == null) {
+ try {
+ restrictionState = new ClientGlobalRestrictionState(token);
+ } catch (RemoteException e) {
+ return;
+ }
+ mOpGlobalRestrictions.put(token, restrictionState);
+ }
+
+ if (restrictionState.setRestriction(code, restricted)) {
+ mHandler.sendMessage(PooledLambda.obtainMessage(
+ AppOpsService::notifyWatchersOfChange, AppOpsService.this, code,
+ UID_ANY));
+ mHandler.sendMessage(PooledLambda.obtainMessage(
+ AppOpsService::updateStartedOpModeForUser, AppOpsService.this,
+ code, restricted, UserHandle.USER_ALL));
+ }
+
+ if (restrictionState.isDefault()) {
+ mOpGlobalRestrictions.remove(token);
+ restrictionState.destroy();
+ }
+ }
+ }
}
/**
diff --git a/services/core/java/com/android/server/biometrics/AuthSession.java b/services/core/java/com/android/server/biometrics/AuthSession.java
index 8f36489..bfb42f8 100644
--- a/services/core/java/com/android/server/biometrics/AuthSession.java
+++ b/services/core/java/com/android/server/biometrics/AuthSession.java
@@ -366,10 +366,9 @@
// sending the final error callback to the application.
for (BiometricSensor sensor : mPreAuthInfo.eligibleSensors) {
try {
- if (filter.apply(sensor)) {
- if (DEBUG) {
- Slog.v(TAG, "Canceling sensor: " + sensor.id);
- }
+ final boolean shouldCancel = filter.apply(sensor);
+ Slog.d(TAG, "sensorId: " + sensor.id + ", shouldCancel: " + shouldCancel);
+ if (shouldCancel) {
sensor.goToStateCancelling(mToken, mOpPackageName);
}
} catch (RemoteException e) {
@@ -542,9 +541,9 @@
if (mState != STATE_AUTH_STARTED
&& mState != STATE_AUTH_STARTED_UI_SHOWING
- && mState != STATE_AUTH_PAUSED) {
- Slog.e(TAG, "onStartFingerprint, unexpected state: " + mState);
- return;
+ && mState != STATE_AUTH_PAUSED
+ && mState != STATE_ERROR_PENDING_SYSUI) {
+ Slog.w(TAG, "onStartFingerprint, started from unexpected state: " + mState);
}
mMultiSensorState = MULTI_SENSOR_STATE_FP_SCANNING;
diff --git a/services/core/java/com/android/server/biometrics/BiometricService.java b/services/core/java/com/android/server/biometrics/BiometricService.java
index e8e25f1..fed320d 100644
--- a/services/core/java/com/android/server/biometrics/BiometricService.java
+++ b/services/core/java/com/android/server/biometrics/BiometricService.java
@@ -1369,11 +1369,11 @@
/**
* handleAuthenticate() (above) which is called from BiometricPrompt determines which
* modality/modalities to start authenticating with. authenticateInternal() should only be
- * used for:
- * 1) Preparing <Biometric>Services for authentication when BiometricPrompt#authenticate is,
- * invoked, shortly after which BiometricPrompt is shown and authentication starts
- * 2) Preparing <Biometric>Services for authentication when BiometricPrompt is already shown
- * and the user has pressed "try again"
+ * used for preparing <Biometric>Services for authentication when BiometricPrompt#authenticate
+ * is invoked, shortly after which BiometricPrompt is shown and authentication starts.
+ *
+ * Note that this path is NOT invoked when the BiometricPrompt "Try again" button is pressed.
+ * In that case, see {@link #handleOnTryAgainPressed()}.
*/
private void authenticateInternal(IBinder token, long operationId, int userId,
IBiometricServiceReceiver receiver, String opPackageName, PromptInfo promptInfo,
diff --git a/services/core/java/com/android/server/biometrics/PreAuthInfo.java b/services/core/java/com/android/server/biometrics/PreAuthInfo.java
index c4bd18b..cd0ff10 100644
--- a/services/core/java/com/android/server/biometrics/PreAuthInfo.java
+++ b/services/core/java/com/android/server/biometrics/PreAuthInfo.java
@@ -408,22 +408,22 @@
public String toString() {
StringBuilder string = new StringBuilder(
"BiometricRequested: " + mBiometricRequested
- + "\nStrengthRequested: " + mBiometricStrengthRequested
- + "\nCredentialRequested: " + credentialRequested);
- string.append("\nEligible:{");
+ + ", StrengthRequested: " + mBiometricStrengthRequested
+ + ", CredentialRequested: " + credentialRequested);
+ string.append(", Eligible:{");
for (BiometricSensor sensor: eligibleSensors) {
string.append(sensor.id).append(" ");
}
string.append("}");
- string.append("\nIneligible:{");
+ string.append(", Ineligible:{");
for (Pair<BiometricSensor, Integer> ineligible : ineligibleSensors) {
string.append(ineligible.first).append(":").append(ineligible.second).append(" ");
}
string.append("}");
- string.append("\nCredentialAvailable: ").append(credentialAvailable);
- string.append("\n");
+ string.append(", CredentialAvailable: ").append(credentialAvailable);
+ string.append(", ");
return string.toString();
}
}
diff --git a/services/core/java/com/android/server/biometrics/sensors/AcquisitionClient.java b/services/core/java/com/android/server/biometrics/sensors/AcquisitionClient.java
index 28e23e3..c8fb80a 100644
--- a/services/core/java/com/android/server/biometrics/sensors/AcquisitionClient.java
+++ b/services/core/java/com/android/server/biometrics/sensors/AcquisitionClient.java
@@ -17,7 +17,6 @@
package com.android.server.biometrics.sensors;
import android.annotation.NonNull;
-import android.annotation.Nullable;
import android.content.Context;
import android.hardware.biometrics.BiometricConstants;
import android.media.AudioAttributes;
@@ -27,7 +26,6 @@
import android.os.SystemClock;
import android.os.VibrationEffect;
import android.os.Vibrator;
-import android.text.TextUtils;
import android.util.Slog;
/**
@@ -39,24 +37,18 @@
private static final String TAG = "Biometrics/AcquisitionClient";
- private static final AudioAttributes VIBRATION_SONFICATION_ATTRIBUTES =
+ private static final AudioAttributes VIBRATION_SONIFICATION_ATTRIBUTES =
new AudioAttributes.Builder()
.setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
.setUsage(AudioAttributes.USAGE_ASSISTANCE_SONIFICATION)
.build();
- private final VibrationEffect mEffectTick = VibrationEffect.get(VibrationEffect.EFFECT_TICK);
- private final VibrationEffect mEffectTextureTick =
- VibrationEffect.get(VibrationEffect.EFFECT_TEXTURE_TICK);
- private final VibrationEffect mEffectClick = VibrationEffect.get(VibrationEffect.EFFECT_CLICK);
- private final VibrationEffect mEffectHeavy =
- VibrationEffect.get(VibrationEffect.EFFECT_HEAVY_CLICK);
- private final VibrationEffect mDoubleClick =
+ private static final VibrationEffect SUCCESS_VIBRATION_EFFECT =
+ VibrationEffect.get(VibrationEffect.EFFECT_CLICK);
+ private static final VibrationEffect ERROR_VIBRATION_EFFECT =
VibrationEffect.get(VibrationEffect.EFFECT_DOUBLE_CLICK);
private final PowerManager mPowerManager;
- private final VibrationEffect mSuccessVibrationEffect;
- private final VibrationEffect mErrorVibrationEffect;
private boolean mShouldSendErrorToClient = true;
private boolean mAlreadyCancelled;
@@ -72,8 +64,6 @@
super(context, lazyDaemon, token, listener, userId, owner, cookie, sensorId, statsModality,
statsAction, statsClient);
mPowerManager = context.getSystemService(PowerManager.class);
- mSuccessVibrationEffect = mEffectClick;
- mErrorVibrationEffect = mDoubleClick;
}
@Override
@@ -192,49 +182,31 @@
mPowerManager.userActivity(now, PowerManager.USER_ACTIVITY_EVENT_TOUCH, 0);
}
- protected @Nullable VibrationEffect getSuccessVibrationEffect() {
- return mSuccessVibrationEffect;
+ protected boolean successHapticsEnabled() {
+ return true;
}
- protected @Nullable VibrationEffect getErrorVibrationEffect() {
- return mErrorVibrationEffect;
+ protected boolean errorHapticsEnabled() {
+ return true;
}
protected final void vibrateSuccess() {
+ if (!successHapticsEnabled()) {
+ return;
+ }
Vibrator vibrator = getContext().getSystemService(Vibrator.class);
- VibrationEffect effect = getSuccessVibrationEffect();
- if (vibrator != null && effect != null) {
- vibrator.vibrate(effect, VIBRATION_SONFICATION_ATTRIBUTES);
+ if (vibrator != null) {
+ vibrator.vibrate(SUCCESS_VIBRATION_EFFECT, VIBRATION_SONIFICATION_ATTRIBUTES);
}
}
protected final void vibrateError() {
+ if (!errorHapticsEnabled()) {
+ return;
+ }
Vibrator vibrator = getContext().getSystemService(Vibrator.class);
- VibrationEffect effect = getErrorVibrationEffect();
- if (vibrator != null && effect != null) {
- vibrator.vibrate(effect, VIBRATION_SONFICATION_ATTRIBUTES);
- }
- }
-
- protected final @NonNull VibrationEffect getVibration(@Nullable String effect,
- @NonNull VibrationEffect defaultEffect) {
- if (TextUtils.isEmpty(effect)) {
- return defaultEffect;
- }
-
- switch (effect.toLowerCase()) {
- case "click":
- return mEffectClick;
- case "heavy":
- return mEffectHeavy;
- case "texture_tick":
- return mEffectTextureTick;
- case "tick":
- return mEffectTick;
- case "double_click":
- return mDoubleClick;
- default:
- return defaultEffect;
+ if (vibrator != null) {
+ vibrator.vibrate(ERROR_VIBRATION_EFFECT, VIBRATION_SONIFICATION_ATTRIBUTES);
}
}
}
diff --git a/services/core/java/com/android/server/biometrics/sensors/AuthenticationClient.java b/services/core/java/com/android/server/biometrics/sensors/AuthenticationClient.java
index 6b9ff6f..cf545f3 100644
--- a/services/core/java/com/android/server/biometrics/sensors/AuthenticationClient.java
+++ b/services/core/java/com/android/server/biometrics/sensors/AuthenticationClient.java
@@ -22,7 +22,6 @@
import android.app.ActivityTaskManager;
import android.app.TaskStackListener;
import android.content.ComponentName;
-import android.content.ContentResolver;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.hardware.biometrics.BiometricAuthenticator;
@@ -31,8 +30,6 @@
import android.hardware.biometrics.BiometricsProtoEnums;
import android.os.IBinder;
import android.os.RemoteException;
-import android.os.VibrationEffect;
-import android.provider.Settings;
import android.security.KeyStore;
import android.util.EventLog;
import android.util.Slog;
@@ -59,14 +56,12 @@
private final LockoutTracker mLockoutTracker;
private final boolean mIsRestricted;
private final boolean mAllowBackgroundAuthentication;
- @NonNull private final ContentResolver mContentResolver;
protected final long mOperationId;
private long mStartTimeMs;
protected boolean mAuthAttempted;
- private final boolean mCustomHaptics;
public AuthenticationClient(@NonNull Context context, @NonNull LazyDaemon<T> lazyDaemon,
@NonNull IBinder token, @NonNull ClientMonitorCallbackConverter listener,
@@ -85,10 +80,6 @@
mLockoutTracker = lockoutTracker;
mIsRestricted = restricted;
mAllowBackgroundAuthentication = allowBackgroundAuthentication;
-
- mContentResolver = context.getContentResolver();
- mCustomHaptics = Settings.Global.getInt(mContentResolver,
- "fp_custom_success_error", 0) == 1;
}
public @LockoutTracker.LockoutMode int handleFailedAttempt(int userId) {
@@ -342,33 +333,4 @@
public boolean interruptsPrecedingClients() {
return true;
}
-
- @Override
- protected @Nullable VibrationEffect getSuccessVibrationEffect() {
- if (!mCustomHaptics) {
- return super.getSuccessVibrationEffect();
- }
-
- if (Settings.Global.getInt(mContentResolver, "fp_success_enabled", 1) == 0) {
- return null;
- }
-
- return getVibration(Settings.Global.getString(mContentResolver,
- "fp_success_type"), super.getSuccessVibrationEffect());
- }
-
- @Override
- protected @Nullable VibrationEffect getErrorVibrationEffect() {
- if (!mCustomHaptics) {
- return super.getErrorVibrationEffect();
- }
-
- if (Settings.Global.getInt(mContentResolver, "fp_error_enabled", 1) == 0) {
- return null;
- }
-
- return getVibration(Settings.Global.getString(mContentResolver,
- "fp_error_type"), super.getErrorVibrationEffect());
-
- }
}
diff --git a/services/core/java/com/android/server/biometrics/sensors/BaseClientMonitor.java b/services/core/java/com/android/server/biometrics/sensors/BaseClientMonitor.java
index f51b1c2..e5e1385 100644
--- a/services/core/java/com/android/server/biometrics/sensors/BaseClientMonitor.java
+++ b/services/core/java/com/android/server/biometrics/sensors/BaseClientMonitor.java
@@ -268,9 +268,9 @@
public String toString() {
return "{[" + mSequentialId + "] "
+ this.getClass().getSimpleName()
- + ", " + getProtoEnum()
- + ", " + getOwnerString()
- + ", " + getCookie()
- + ", " + getTargetUserId() + "}";
+ + ", proto=" + getProtoEnum()
+ + ", owner=" + getOwnerString()
+ + ", cookie=" + getCookie()
+ + ", userId=" + getTargetUserId() + "}";
}
}
diff --git a/services/core/java/com/android/server/biometrics/sensors/BiometricScheduler.java b/services/core/java/com/android/server/biometrics/sensors/BiometricScheduler.java
index b52cb70..adda10e 100644
--- a/services/core/java/com/android/server/biometrics/sensors/BiometricScheduler.java
+++ b/services/core/java/com/android/server/biometrics/sensors/BiometricScheduler.java
@@ -579,6 +579,9 @@
final boolean isCorrectClient = isAuthenticationOrDetectionOperation(mCurrentOperation);
final boolean tokenMatches = mCurrentOperation.mClientMonitor.getToken() == token;
+ Slog.d(getTag(), "cancelAuthenticationOrDetection, isCorrectClient: " + isCorrectClient
+ + ", tokenMatches: " + tokenMatches);
+
if (isCorrectClient && tokenMatches) {
Slog.d(getTag(), "Cancelling: " + mCurrentOperation);
cancelInternal(mCurrentOperation);
diff --git a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceAuthenticationClient.java b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceAuthenticationClient.java
index 98f9fe1..db927b2 100644
--- a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceAuthenticationClient.java
+++ b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceAuthenticationClient.java
@@ -33,7 +33,6 @@
import android.hardware.face.FaceManager;
import android.os.IBinder;
import android.os.RemoteException;
-import android.os.VibrationEffect;
import android.provider.Settings;
import android.util.Slog;
@@ -264,22 +263,16 @@
}
@Override
- protected @Nullable VibrationEffect getSuccessVibrationEffect() {
- if (!mCustomHaptics) {
- return super.getSuccessVibrationEffect();
- }
-
- return getVibration(Settings.Global.getString(mContentResolver,
- "face_success_type"), super.getSuccessVibrationEffect());
+ protected boolean successHapticsEnabled() {
+ return mCustomHaptics
+ ? Settings.Global.getInt(mContentResolver, "face_success_enabled", 1) == 0
+ : super.successHapticsEnabled();
}
@Override
- protected @Nullable VibrationEffect getErrorVibrationEffect() {
- if (!mCustomHaptics) {
- return super.getErrorVibrationEffect();
- }
-
- return getVibration(Settings.Global.getString(mContentResolver,
- "face_error_type"), super.getErrorVibrationEffect());
+ protected boolean errorHapticsEnabled() {
+ return mCustomHaptics
+ ? Settings.Global.getInt(mContentResolver, "face_error_enabled", 1) == 0
+ : super.errorHapticsEnabled();
}
}
diff --git a/services/core/java/com/android/server/biometrics/sensors/face/hidl/FaceAuthenticationClient.java b/services/core/java/com/android/server/biometrics/sensors/face/hidl/FaceAuthenticationClient.java
index 38e6f08..6c0adaf 100644
--- a/services/core/java/com/android/server/biometrics/sensors/face/hidl/FaceAuthenticationClient.java
+++ b/services/core/java/com/android/server/biometrics/sensors/face/hidl/FaceAuthenticationClient.java
@@ -28,7 +28,6 @@
import android.hardware.face.FaceManager;
import android.os.IBinder;
import android.os.RemoteException;
-import android.os.VibrationEffect;
import android.provider.Settings;
import android.util.Slog;
@@ -203,22 +202,16 @@
}
@Override
- protected @NonNull VibrationEffect getSuccessVibrationEffect() {
- if (!mCustomHaptics) {
- return super.getSuccessVibrationEffect();
- }
-
- return getVibration(Settings.Global.getString(mContentResolver,
- "face_success_type"), super.getSuccessVibrationEffect());
+ protected boolean successHapticsEnabled() {
+ return mCustomHaptics
+ ? Settings.Global.getInt(mContentResolver, "face_success_enabled", 1) == 0
+ : super.successHapticsEnabled();
}
@Override
- protected @NonNull VibrationEffect getErrorVibrationEffect() {
- if (!mCustomHaptics) {
- return super.getErrorVibrationEffect();
- }
-
- return getVibration(Settings.Global.getString(mContentResolver,
- "face_error_type"), super.getErrorVibrationEffect());
+ protected boolean errorHapticsEnabled() {
+ return mCustomHaptics
+ ? Settings.Global.getInt(mContentResolver, "face_error_enabled", 1) == 0
+ : super.errorHapticsEnabled();
}
}
diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java
index 54abc63..012e47e 100644
--- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java
+++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java
@@ -498,6 +498,8 @@
Utils.checkPermission(getContext(), MANAGE_BIOMETRIC);
+ Slog.d(TAG, "cancelAuthenticationFromService, sensorId: " + sensorId);
+
final ServiceProvider provider = getProviderForSensor(sensorId);
if (provider == null) {
Slog.w(TAG, "Null provider for cancelAuthenticationFromService");
diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClient.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClient.java
index ba6ef29..1825eda 100644
--- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClient.java
+++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClient.java
@@ -19,6 +19,7 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.TaskStackListener;
+import android.content.ContentResolver;
import android.content.Context;
import android.hardware.biometrics.BiometricAuthenticator;
import android.hardware.biometrics.BiometricFingerprintConstants;
@@ -29,6 +30,7 @@
import android.hardware.fingerprint.IUdfpsOverlayController;
import android.os.IBinder;
import android.os.RemoteException;
+import android.provider.Settings;
import android.util.Slog;
import com.android.server.biometrics.Utils;
@@ -55,6 +57,9 @@
@Nullable private final IUdfpsOverlayController mUdfpsOverlayController;
@Nullable private ICancellationSignal mCancellationSignal;
+ @NonNull private final ContentResolver mContentResolver;
+ private final boolean mCustomHaptics;
+
FingerprintAuthenticationClient(@NonNull Context context,
@NonNull LazyDaemon<ISession> lazyDaemon, @NonNull IBinder token,
@NonNull ClientMonitorCallbackConverter listener, int targetUserId, long operationId,
@@ -69,6 +74,10 @@
lockoutCache, allowBackgroundAuthentication);
mLockoutCache = lockoutCache;
mUdfpsOverlayController = udfpsOverlayController;
+
+ mContentResolver = context.getContentResolver();
+ mCustomHaptics = Settings.Global.getInt(mContentResolver,
+ "fp_custom_success_error", 0) == 1;
}
@NonNull
@@ -204,4 +213,18 @@
UdfpsHelper.hideUdfpsOverlay(getSensorId(), mUdfpsOverlayController);
mCallback.onClientFinished(this, false /* success */);
}
+
+ @Override
+ protected boolean successHapticsEnabled() {
+ return mCustomHaptics
+ ? Settings.Global.getInt(mContentResolver, "fp_success_enabled", 1) == 0
+ : super.successHapticsEnabled();
+ }
+
+ @Override
+ protected boolean errorHapticsEnabled() {
+ return mCustomHaptics
+ ? Settings.Global.getInt(mContentResolver, "fp_error_enabled", 1) == 0
+ : super.errorHapticsEnabled();
+ }
}
diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21.java
index 102aecc..7daea88 100644
--- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21.java
+++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21.java
@@ -632,6 +632,7 @@
@Override
public void cancelAuthentication(int sensorId, @NonNull IBinder token) {
+ Slog.d(TAG, "cancelAuthentication, sensorId: " + sensorId);
mHandler.post(() -> mScheduler.cancelAuthenticationOrDetection(token));
}
diff --git a/services/core/java/com/android/server/display/DisplayManagerService.java b/services/core/java/com/android/server/display/DisplayManagerService.java
index 182a038..0decd33 100644
--- a/services/core/java/com/android/server/display/DisplayManagerService.java
+++ b/services/core/java/com/android/server/display/DisplayManagerService.java
@@ -1528,8 +1528,14 @@
if (requestedModeId == 0 && requestedRefreshRate != 0) {
// Scan supported modes returned by display.getInfo() to find a mode with the same
// size as the default display mode but with the specified refresh rate instead.
- requestedModeId = display.getDisplayInfoLocked().findDefaultModeByRefreshRate(
- requestedRefreshRate).getModeId();
+ Display.Mode mode = display.getDisplayInfoLocked().findDefaultModeByRefreshRate(
+ requestedRefreshRate);
+ if (mode != null) {
+ requestedModeId = mode.getModeId();
+ } else {
+ Slog.e(TAG, "Couldn't find a mode for the requestedRefreshRate: "
+ + requestedRefreshRate + " on Display: " + displayId);
+ }
}
mDisplayModeDirector.getAppRequestObserver().setAppRequest(
displayId, requestedModeId, requestedMaxRefreshRate);
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java
index 505e743..a2cb78d 100755
--- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java
+++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java
@@ -23,6 +23,7 @@
import android.hardware.hdmi.IHdmiControlCallback;
import android.hardware.input.InputManager;
import android.hardware.tv.cec.V1_0.SendMessageResult;
+import android.media.AudioManager;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
@@ -685,6 +686,9 @@
Message.obtain(mHandler, MSG_USER_CONTROL_RELEASE_TIMEOUT),
FOLLOWER_SAFETY_TIMEOUT);
return Constants.HANDLED;
+ } else if (params.length > 0) {
+ // Handle CEC UI commands that are not mapped to an Android keycode
+ return handleUnmappedCecKeycode(params[0]);
}
return Constants.ABORT_INVALID_OPERAND;
@@ -692,6 +696,21 @@
@ServiceThreadOnly
@Constants.HandleMessageResult
+ protected int handleUnmappedCecKeycode(int cecKeycode) {
+ if (cecKeycode == HdmiCecKeycode.CEC_KEYCODE_MUTE_FUNCTION) {
+ mService.getAudioManager().adjustStreamVolume(AudioManager.STREAM_MUSIC,
+ AudioManager.ADJUST_MUTE, AudioManager.FLAG_SHOW_UI);
+ return Constants.HANDLED;
+ } else if (cecKeycode == HdmiCecKeycode.CEC_KEYCODE_RESTORE_VOLUME_FUNCTION) {
+ mService.getAudioManager().adjustStreamVolume(AudioManager.STREAM_MUSIC,
+ AudioManager.ADJUST_UNMUTE, AudioManager.FLAG_SHOW_UI);
+ return Constants.HANDLED;
+ }
+ return Constants.ABORT_INVALID_OPERAND;
+ }
+
+ @ServiceThreadOnly
+ @Constants.HandleMessageResult
protected int handleUserControlReleased() {
assertRunOnServiceThread();
mHandler.removeMessages(MSG_USER_CONTROL_RELEASE_TIMEOUT);
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index f44241d..889785d 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -21486,7 +21486,7 @@
// user handle installed state
int[] allUsers;
final int freezeUser;
- final SparseArray<Pair<Integer, String>> enabledStateAndCallerPerUser;
+ final SparseArray<TempUserState> priorUserStates;
/** enabled state of the uninstalled application */
synchronized (mLock) {
uninstalledPs = mSettings.getPackageLPr(packageName);
@@ -21537,16 +21537,16 @@
// We're downgrading a system app, which will apply to all users, so
// freeze them all during the downgrade
freezeUser = UserHandle.USER_ALL;
- enabledStateAndCallerPerUser = new SparseArray<>();
+ priorUserStates = new SparseArray<>();
for (int i = 0; i < allUsers.length; i++) {
PackageUserState userState = uninstalledPs.readUserState(allUsers[i]);
- Pair<Integer, String> enabledStateAndCaller =
- new Pair<>(userState.enabled, userState.lastDisableAppCaller);
- enabledStateAndCallerPerUser.put(allUsers[i], enabledStateAndCaller);
+ priorUserStates.put(allUsers[i],
+ new TempUserState(userState.enabled, userState.lastDisableAppCaller,
+ userState.installed));
}
} else {
freezeUser = removeUser;
- enabledStateAndCallerPerUser = null;
+ priorUserStates = null;
}
}
@@ -21583,6 +21583,30 @@
if (info.args != null) {
info.args.doPostDeleteLI(true);
}
+
+ boolean reEnableStub = false;
+
+ if (priorUserStates != null) {
+ synchronized (mLock) {
+ for (int i = 0; i < allUsers.length; i++) {
+ TempUserState priorUserState = priorUserStates.get(allUsers[i]);
+ int enabledState = priorUserState.enabledState;
+ PackageSetting pkgSetting = getPackageSetting(packageName);
+ pkgSetting.setEnabled(enabledState, allUsers[i],
+ priorUserState.lastDisableAppCaller);
+
+ AndroidPackage aPkg = pkgSetting.getPkg();
+ boolean pkgEnabled = aPkg != null && aPkg.isEnabled();
+ if (!reEnableStub && priorUserState.installed
+ && ((enabledState == COMPONENT_ENABLED_STATE_DEFAULT && pkgEnabled)
+ || enabledState == COMPONENT_ENABLED_STATE_ENABLED)) {
+ reEnableStub = true;
+ }
+ }
+ mSettings.writeAllUsersPackageRestrictionsLPr();
+ }
+ }
+
final AndroidPackage stubPkg =
(disabledSystemPs == null) ? null : disabledSystemPs.pkg;
if (stubPkg != null && stubPkg.isStub()) {
@@ -21592,19 +21616,7 @@
}
if (stubPs != null) {
- boolean enable = false;
- for (int aUserId : allUsers) {
- if (stubPs.getInstalled(aUserId)) {
- int enabled = stubPs.getEnabled(aUserId);
- if (enabled == COMPONENT_ENABLED_STATE_DEFAULT
- || enabled == COMPONENT_ENABLED_STATE_ENABLED) {
- enable = true;
- break;
- }
- }
- }
-
- if (enable) {
+ if (reEnableStub) {
if (DEBUG_COMPRESSION) {
Slog.i(TAG, "Enabling system stub after removal; pkg: "
+ stubPkg.getPackageName());
@@ -21616,19 +21628,6 @@
}
}
}
- if (enabledStateAndCallerPerUser != null) {
- synchronized (mLock) {
- for (int i = 0; i < allUsers.length; i++) {
- Pair<Integer, String> enabledStateAndCaller =
- enabledStateAndCallerPerUser.get(allUsers[i]);
- getPackageSetting(packageName)
- .setEnabled(enabledStateAndCaller.first,
- allUsers[i],
- enabledStateAndCaller.second);
- }
- mSettings.writeAllUsersPackageRestrictionsLPr();
- }
- }
}
return res ? PackageManager.DELETE_SUCCEEDED : PackageManager.DELETE_FAILED_INTERNAL_ERROR;
@@ -28933,6 +28932,20 @@
}
}
}
+
+ private static class TempUserState {
+ public final int enabledState;
+ @Nullable
+ public final String lastDisableAppCaller;
+ public final boolean installed;
+
+ private TempUserState(int enabledState, @Nullable String lastDisableAppCaller,
+ boolean installed) {
+ this.enabledState = enabledState;
+ this.lastDisableAppCaller = lastDisableAppCaller;
+ this.installed = installed;
+ }
+ }
}
interface PackageSender {
diff --git a/services/core/java/com/android/server/pm/TEST_MAPPING b/services/core/java/com/android/server/pm/TEST_MAPPING
index 878eb92..9182d81 100644
--- a/services/core/java/com/android/server/pm/TEST_MAPPING
+++ b/services/core/java/com/android/server/pm/TEST_MAPPING
@@ -162,9 +162,6 @@
"include-filter": "com.android.server.pm.parsing.SystemPartitionParseTest"
}
]
- },
- {
- "name": "CtsPackageManagerBootTestCases"
}
],
"imports": [
diff --git a/services/core/java/com/android/server/policy/AppOpsPolicy.java b/services/core/java/com/android/server/policy/AppOpsPolicy.java
index a389f40..7689f5f 100644
--- a/services/core/java/com/android/server/policy/AppOpsPolicy.java
+++ b/services/core/java/com/android/server/policy/AppOpsPolicy.java
@@ -81,6 +81,12 @@
private final VoiceInteractionManagerInternal mVoiceInteractionManagerInternal;
/**
+ * Whether this device allows only the HotwordDetectionService to use OP_RECORD_AUDIO_HOTWORD
+ * which doesn't incur the privacy indicator.
+ */
+ private final boolean mIsHotwordDetectionServiceRequired;
+
+ /**
* The locking policy around the location tags is a bit special. Since we want to
* avoid grabbing the lock on every op note we are taking the approach where the
* read and write are being done via a thread-safe data structure such that the
@@ -114,6 +120,8 @@
mRoleManager = mContext.getSystemService(RoleManager.class);
mVoiceInteractionManagerInternal = LocalServices.getService(
VoiceInteractionManagerInternal.class);
+ mIsHotwordDetectionServiceRequired = isHotwordDetectionServiceRequired(
+ mContext.getPackageManager());
final LocationManagerInternal locationManagerInternal = LocalServices.getService(
LocationManagerInternal.class);
@@ -174,6 +182,12 @@
initializeActivityRecognizersTags();
}
+ private static boolean isHotwordDetectionServiceRequired(PackageManager pm) {
+ // The HotwordDetectionService APIs aren't ready yet for Auto or TV.
+ return !(pm.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE)
+ || pm.hasSystemFeature(PackageManager.FEATURE_LEANBACK));
+ }
+
@Override
public int checkOperation(int code, int uid, String packageName,
@Nullable String attributionTag, boolean raw,
@@ -257,6 +271,7 @@
private int resolveDatasourceOp(int code, int uid, @NonNull String packageName,
@Nullable String attributionTag) {
+ code = resolveRecordAudioOp(code, uid);
if (attributionTag == null) {
return code;
}
@@ -359,6 +374,24 @@
return code;
}
+ private int resolveRecordAudioOp(int code, int uid) {
+ if (code == AppOpsManager.OP_RECORD_AUDIO_HOTWORD) {
+ if (!mIsHotwordDetectionServiceRequired) {
+ return code;
+ }
+ // Only the HotwordDetectionService can use the HOTWORD op which doesn't incur the
+ // privacy indicator. Downgrade to standard RECORD_AUDIO for other processes.
+ final HotwordDetectionServiceIdentity hotwordDetectionServiceIdentity =
+ mVoiceInteractionManagerInternal.getHotwordDetectionServiceIdentity();
+ if (hotwordDetectionServiceIdentity != null
+ && uid == hotwordDetectionServiceIdentity.getIsolatedUid()) {
+ return code;
+ }
+ return AppOpsManager.OP_RECORD_AUDIO;
+ }
+ return code;
+ }
+
private int resolveUid(int code, int uid) {
// The HotwordDetectionService is an isolated service, which ordinarily cannot hold
// permissions. So we allow it to assume the owning package identity for certain
diff --git a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java
index cd0ce2b..dda8961 100644
--- a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java
+++ b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java
@@ -117,6 +117,7 @@
import android.os.Process;
import android.os.RemoteException;
import android.os.ServiceManager;
+import android.os.ServiceSpecificException;
import android.os.StatFs;
import android.os.SynchronousResultReceiver;
import android.os.SystemClock;
@@ -132,6 +133,18 @@
import android.os.storage.VolumeInfo;
import android.provider.DeviceConfig;
import android.provider.Settings;
+import android.security.metrics.IKeystoreMetrics;
+import android.security.metrics.KeyCreationWithAuthInfo;
+import android.security.metrics.KeyCreationWithGeneralInfo;
+import android.security.metrics.KeyCreationWithPurposeAndModesInfo;
+import android.security.metrics.KeyOperationWithGeneralInfo;
+import android.security.metrics.KeyOperationWithPurposeAndModesInfo;
+import android.security.metrics.Keystore2AtomWithOverflow;
+import android.security.metrics.KeystoreAtom;
+import android.security.metrics.KeystoreAtomPayload;
+import android.security.metrics.RkpErrorStats;
+import android.security.metrics.RkpPoolStats;
+import android.security.metrics.StorageStats;
import android.stats.storage.StorageEnums;
import android.telephony.ModemActivityInfo;
import android.telephony.SubscriptionInfo;
@@ -373,6 +386,10 @@
private SelectedProcessCpuThreadReader mSurfaceFlingerProcessCpuThreadReader;
+ // Only access via getIKeystoreMetricsService
+ @GuardedBy("mKeystoreLock")
+ private IKeystoreMetrics mIKeystoreMetrics;
+
// Puller locks
private final Object mDataBytesTransferLock = new Object();
private final Object mBluetoothBytesTransferLock = new Object();
@@ -428,6 +445,7 @@
private final Object mAttributedAppOpsLock = new Object();
private final Object mSettingsStatsLock = new Object();
private final Object mInstalledIncrementalPackagesLock = new Object();
+ private final Object mKeystoreLock = new Object();
public StatsPullAtomService(Context context) {
super(context);
@@ -435,6 +453,7 @@
}
private native void initializeNativePullers();
+
/**
* Use of this StatsPullAtomCallbackImpl means we avoid one class per tagId, which we would
* get if we used lambdas.
@@ -703,6 +722,16 @@
synchronized (mInstalledIncrementalPackagesLock) {
return pullInstalledIncrementalPackagesLocked(atomTag, data);
}
+ case FrameworkStatsLog.KEYSTORE2_STORAGE_STATS:
+ case FrameworkStatsLog.RKP_POOL_STATS:
+ case FrameworkStatsLog.KEYSTORE2_KEY_CREATION_WITH_GENERAL_INFO:
+ case FrameworkStatsLog.KEYSTORE2_KEY_CREATION_WITH_AUTH_INFO:
+ case FrameworkStatsLog.KEYSTORE2_KEY_CREATION_WITH_PURPOSE_AND_MODES_INFO:
+ case FrameworkStatsLog.KEYSTORE2_ATOM_WITH_OVERFLOW:
+ case FrameworkStatsLog.KEYSTORE2_KEY_OPERATION_WITH_PURPOSE_AND_MODES_INFO:
+ case FrameworkStatsLog.KEYSTORE2_KEY_OPERATION_WITH_GENERAL_INFO:
+ case FrameworkStatsLog.RKP_ERROR_STATS:
+ return pullKeystoreAtoms(atomTag, data);
default:
throw new UnsupportedOperationException("Unknown tagId=" + atomTag);
}
@@ -795,6 +824,8 @@
mSurfaceFlingerProcessCpuThreadReader =
new SelectedProcessCpuThreadReader("/system/bin/surfaceflinger");
+
+ getIKeystoreMetricsService();
}
void registerEventListeners() {
@@ -887,6 +918,15 @@
registerBatteryCycleCount();
registerSettingsStats();
registerInstalledIncrementalPackages();
+ registerKeystoreStorageStats();
+ registerRkpPoolStats();
+ registerKeystoreKeyCreationWithGeneralInfo();
+ registerKeystoreKeyCreationWithAuthInfo();
+ registerKeystoreKeyCreationWithPurposeModesInfo();
+ registerKeystoreAtomWithOverflow();
+ registerKeystoreKeyOperationWithPurposeAndModesInfo();
+ registerKeystoreKeyOperationWithGeneralInfo();
+ registerRkpErrorStats();
}
private void initAndRegisterNetworkStatsPullers() {
@@ -971,6 +1011,28 @@
}
}
+ private IKeystoreMetrics getIKeystoreMetricsService() {
+ synchronized (mKeystoreLock) {
+ if (mIKeystoreMetrics == null) {
+ mIKeystoreMetrics = IKeystoreMetrics.Stub.asInterface(
+ ServiceManager.getService("android.security.metrics"));
+ if (mIKeystoreMetrics != null) {
+ try {
+ mIKeystoreMetrics.asBinder().linkToDeath(() -> {
+ synchronized (mKeystoreLock) {
+ mIKeystoreMetrics = null;
+ }
+ }, /* flags */ 0);
+ } catch (RemoteException e) {
+ Slog.e(TAG, "linkToDeath with IKeystoreMetrics failed", e);
+ mIKeystoreMetrics = null;
+ }
+ }
+ }
+ return mIKeystoreMetrics;
+ }
+ }
+
private IStoraged getIStoragedService() {
synchronized (mStoragedLock) {
if (mStorageService == null) {
@@ -4005,6 +4067,253 @@
return StatsManager.PULL_SUCCESS;
}
+ private void registerKeystoreStorageStats() {
+ mStatsManager.setPullAtomCallback(
+ FrameworkStatsLog.KEYSTORE2_STORAGE_STATS,
+ null, // use default PullAtomMetadata values,
+ DIRECT_EXECUTOR,
+ mStatsCallbackImpl);
+ }
+
+ private void registerRkpPoolStats() {
+ mStatsManager.setPullAtomCallback(
+ FrameworkStatsLog.RKP_POOL_STATS,
+ null, // use default PullAtomMetadata values,
+ DIRECT_EXECUTOR,
+ mStatsCallbackImpl);
+ }
+
+ private void registerKeystoreKeyCreationWithGeneralInfo() {
+ mStatsManager.setPullAtomCallback(
+ FrameworkStatsLog.KEYSTORE2_KEY_CREATION_WITH_GENERAL_INFO,
+ null, // use default PullAtomMetadata values,
+ DIRECT_EXECUTOR,
+ mStatsCallbackImpl);
+ }
+
+ private void registerKeystoreKeyCreationWithAuthInfo() {
+ mStatsManager.setPullAtomCallback(
+ FrameworkStatsLog.KEYSTORE2_KEY_CREATION_WITH_AUTH_INFO,
+ null, // use default PullAtomMetadata values,
+ DIRECT_EXECUTOR,
+ mStatsCallbackImpl);
+ }
+
+ private void registerKeystoreKeyCreationWithPurposeModesInfo() {
+ mStatsManager.setPullAtomCallback(
+ FrameworkStatsLog.KEYSTORE2_KEY_CREATION_WITH_PURPOSE_AND_MODES_INFO,
+ null, // use default PullAtomMetadata values,
+ DIRECT_EXECUTOR,
+ mStatsCallbackImpl);
+ }
+
+ private void registerKeystoreAtomWithOverflow() {
+ mStatsManager.setPullAtomCallback(
+ FrameworkStatsLog.KEYSTORE2_ATOM_WITH_OVERFLOW,
+ null, // use default PullAtomMetadata values,
+ DIRECT_EXECUTOR,
+ mStatsCallbackImpl);
+ }
+
+ private void registerKeystoreKeyOperationWithPurposeAndModesInfo() {
+ mStatsManager.setPullAtomCallback(
+ FrameworkStatsLog.KEYSTORE2_KEY_OPERATION_WITH_PURPOSE_AND_MODES_INFO,
+ null, // use default PullAtomMetadata values,
+ DIRECT_EXECUTOR,
+ mStatsCallbackImpl);
+ }
+
+ private void registerKeystoreKeyOperationWithGeneralInfo() {
+ mStatsManager.setPullAtomCallback(
+ FrameworkStatsLog.KEYSTORE2_KEY_OPERATION_WITH_GENERAL_INFO,
+ null, // use default PullAtomMetadata values,
+ DIRECT_EXECUTOR,
+ mStatsCallbackImpl);
+ }
+
+ private void registerRkpErrorStats() {
+ mStatsManager.setPullAtomCallback(
+ FrameworkStatsLog.RKP_ERROR_STATS,
+ null, // use default PullAtomMetadata values,
+ DIRECT_EXECUTOR,
+ mStatsCallbackImpl);
+ }
+
+ int parseKeystoreStorageStats(KeystoreAtom[] atoms, List<StatsEvent> pulledData) {
+ for (KeystoreAtom atomWrapper : atoms) {
+ if (atomWrapper.payload.getTag() != KeystoreAtomPayload.storageStats) {
+ return StatsManager.PULL_SKIP;
+ }
+ StorageStats atom = atomWrapper.payload.getStorageStats();
+ pulledData.add(FrameworkStatsLog.buildStatsEvent(
+ FrameworkStatsLog.KEYSTORE2_STORAGE_STATS, atom.storage_type,
+ atom.size, atom.unused_size));
+ }
+ return StatsManager.PULL_SUCCESS;
+ }
+
+ int parseRkpPoolStats(KeystoreAtom[] atoms, List<StatsEvent> pulledData) {
+ for (KeystoreAtom atomWrapper : atoms) {
+ if (atomWrapper.payload.getTag() != KeystoreAtomPayload.rkpPoolStats) {
+ return StatsManager.PULL_SKIP;
+ }
+ RkpPoolStats atom = atomWrapper.payload.getRkpPoolStats();
+ pulledData.add(FrameworkStatsLog.buildStatsEvent(
+ FrameworkStatsLog.RKP_POOL_STATS, atom.pool_status, atom.count_of_keys));
+ }
+ return StatsManager.PULL_SUCCESS;
+ }
+
+ int parseKeystoreKeyCreationWithGeneralInfo(KeystoreAtom[] atoms, List<StatsEvent> pulledData) {
+ for (KeystoreAtom atomWrapper : atoms) {
+ if (atomWrapper.payload.getTag()
+ != KeystoreAtomPayload.keyCreationWithGeneralInfo) {
+ return StatsManager.PULL_SKIP;
+ }
+ KeyCreationWithGeneralInfo atom = atomWrapper.payload.getKeyCreationWithGeneralInfo();
+ pulledData.add(FrameworkStatsLog.buildStatsEvent(
+ FrameworkStatsLog.KEYSTORE2_KEY_CREATION_WITH_GENERAL_INFO, atom.algorithm,
+ atom.key_size, atom.ec_curve, atom.key_origin, atom.error_code,
+ atom.attestation_requested, atomWrapper.count));
+ }
+ return StatsManager.PULL_SUCCESS;
+ }
+
+ int parseKeystoreKeyCreationWithAuthInfo(KeystoreAtom[] atoms, List<StatsEvent> pulledData) {
+ for (KeystoreAtom atomWrapper : atoms) {
+ if (atomWrapper.payload.getTag() != KeystoreAtomPayload.keyCreationWithAuthInfo) {
+ return StatsManager.PULL_SKIP;
+ }
+ KeyCreationWithAuthInfo atom = atomWrapper.payload.getKeyCreationWithAuthInfo();
+ pulledData.add(FrameworkStatsLog.buildStatsEvent(
+ FrameworkStatsLog.KEYSTORE2_KEY_CREATION_WITH_AUTH_INFO, atom.user_auth_type,
+ atom.log10_auth_key_timeout_seconds, atom.security_level, atomWrapper.count));
+ }
+ return StatsManager.PULL_SUCCESS;
+ }
+
+
+ int parseKeystoreKeyCreationWithPurposeModesInfo(KeystoreAtom[] atoms,
+ List<StatsEvent> pulledData) {
+ for (KeystoreAtom atomWrapper : atoms) {
+ if (atomWrapper.payload.getTag()
+ != KeystoreAtomPayload.keyCreationWithPurposeAndModesInfo) {
+ return StatsManager.PULL_SKIP;
+ }
+ KeyCreationWithPurposeAndModesInfo atom =
+ atomWrapper.payload.getKeyCreationWithPurposeAndModesInfo();
+ pulledData.add(FrameworkStatsLog.buildStatsEvent(
+ FrameworkStatsLog.KEYSTORE2_KEY_CREATION_WITH_PURPOSE_AND_MODES_INFO,
+ atom.algorithm, atom.purpose_bitmap,
+ atom.padding_mode_bitmap, atom.digest_bitmap, atom.block_mode_bitmap,
+ atomWrapper.count));
+ }
+ return StatsManager.PULL_SUCCESS;
+ }
+
+ int parseKeystoreAtomWithOverflow(KeystoreAtom[] atoms, List<StatsEvent> pulledData) {
+ for (KeystoreAtom atomWrapper : atoms) {
+ if (atomWrapper.payload.getTag()
+ != KeystoreAtomPayload.keystore2AtomWithOverflow) {
+ return StatsManager.PULL_SKIP;
+ }
+ Keystore2AtomWithOverflow atom = atomWrapper.payload.getKeystore2AtomWithOverflow();
+ pulledData.add(FrameworkStatsLog.buildStatsEvent(
+ FrameworkStatsLog.KEYSTORE2_ATOM_WITH_OVERFLOW, atom.atom_id,
+ atomWrapper.count));
+ }
+ return StatsManager.PULL_SUCCESS;
+ }
+
+ int parseKeystoreKeyOperationWithPurposeModesInfo(KeystoreAtom[] atoms,
+ List<StatsEvent> pulledData) {
+ for (KeystoreAtom atomWrapper : atoms) {
+ if (atomWrapper.payload.getTag()
+ != KeystoreAtomPayload.keyOperationWithPurposeAndModesInfo) {
+ return StatsManager.PULL_SKIP;
+ }
+ KeyOperationWithPurposeAndModesInfo atom =
+ atomWrapper.payload.getKeyOperationWithPurposeAndModesInfo();
+ pulledData.add(FrameworkStatsLog.buildStatsEvent(
+ FrameworkStatsLog.KEYSTORE2_KEY_OPERATION_WITH_PURPOSE_AND_MODES_INFO,
+ atom.purpose, atom.padding_mode_bitmap, atom.digest_bitmap,
+ atom.block_mode_bitmap, atomWrapper.count));
+ }
+ return StatsManager.PULL_SUCCESS;
+ }
+
+ int parseKeystoreKeyOperationWithGeneralInfo(KeystoreAtom[] atoms,
+ List<StatsEvent> pulledData) {
+ for (KeystoreAtom atomWrapper : atoms) {
+ if (atomWrapper.payload.getTag()
+ != KeystoreAtomPayload.keyOperationWithGeneralInfo) {
+ return StatsManager.PULL_SKIP;
+ }
+ KeyOperationWithGeneralInfo atom = atomWrapper.payload.getKeyOperationWithGeneralInfo();
+ pulledData.add(FrameworkStatsLog.buildStatsEvent(
+ FrameworkStatsLog.KEYSTORE2_KEY_OPERATION_WITH_GENERAL_INFO, atom.outcome,
+ atom.error_code, atom.key_upgraded, atom.security_level, atomWrapper.count));
+ }
+ return StatsManager.PULL_SUCCESS;
+ }
+
+ int parseRkpErrorStats(KeystoreAtom[] atoms,
+ List<StatsEvent> pulledData) {
+ for (KeystoreAtom atomWrapper : atoms) {
+ if (atomWrapper.payload.getTag() != KeystoreAtomPayload.rkpErrorStats) {
+ return StatsManager.PULL_SKIP;
+ }
+ RkpErrorStats atom = atomWrapper.payload.getRkpErrorStats();
+ pulledData.add(FrameworkStatsLog.buildStatsEvent(
+ FrameworkStatsLog.RKP_ERROR_STATS, atom.rkpError, atomWrapper.count));
+ }
+ return StatsManager.PULL_SUCCESS;
+ }
+
+ int pullKeystoreAtoms(int atomTag, List<StatsEvent> pulledData) {
+ IKeystoreMetrics keystoreMetricsService = getIKeystoreMetricsService();
+ if (keystoreMetricsService == null) {
+ Slog.w(TAG, "Keystore service is null");
+ return StatsManager.PULL_SKIP;
+ }
+ final long callingToken = Binder.clearCallingIdentity();
+ try {
+ KeystoreAtom[] atoms = keystoreMetricsService.pullMetrics(atomTag);
+ switch (atomTag) {
+ case FrameworkStatsLog.KEYSTORE2_STORAGE_STATS:
+ return parseKeystoreStorageStats(atoms, pulledData);
+ case FrameworkStatsLog.RKP_POOL_STATS:
+ return parseRkpPoolStats(atoms, pulledData);
+ case FrameworkStatsLog.KEYSTORE2_KEY_CREATION_WITH_GENERAL_INFO:
+ return parseKeystoreKeyCreationWithGeneralInfo(atoms, pulledData);
+ case FrameworkStatsLog.KEYSTORE2_KEY_CREATION_WITH_AUTH_INFO:
+ return parseKeystoreKeyCreationWithAuthInfo(atoms, pulledData);
+ case FrameworkStatsLog.KEYSTORE2_KEY_CREATION_WITH_PURPOSE_AND_MODES_INFO:
+ return parseKeystoreKeyCreationWithPurposeModesInfo(atoms, pulledData);
+ case FrameworkStatsLog.KEYSTORE2_ATOM_WITH_OVERFLOW:
+ return parseKeystoreAtomWithOverflow(atoms, pulledData);
+ case FrameworkStatsLog.KEYSTORE2_KEY_OPERATION_WITH_PURPOSE_AND_MODES_INFO:
+ return parseKeystoreKeyOperationWithPurposeModesInfo(atoms, pulledData);
+ case FrameworkStatsLog.KEYSTORE2_KEY_OPERATION_WITH_GENERAL_INFO:
+ return parseKeystoreKeyOperationWithGeneralInfo(atoms, pulledData);
+ case FrameworkStatsLog.RKP_ERROR_STATS:
+ return parseRkpErrorStats(atoms, pulledData);
+ default:
+ Slog.w(TAG, "Unsupported keystore atom: " + atomTag);
+ return StatsManager.PULL_SKIP;
+ }
+ } catch (RemoteException e) {
+ // Should not happen.
+ Slog.e(TAG, "Disconnected from keystore service. Cannot pull.", e);
+ return StatsManager.PULL_SKIP;
+ } catch (ServiceSpecificException e) {
+ Slog.e(TAG, "pulling keystore metrics failed", e);
+ return StatsManager.PULL_SKIP;
+ } finally {
+ Binder.restoreCallingIdentity(callingToken);
+ }
+ }
+
// Thermal event received from vendor thermal management subsystem
private static final class ThermalEventListener extends IThermalEventListener.Stub {
@Override
diff --git a/services/core/java/com/android/server/timedetector/ServerFlags.java b/services/core/java/com/android/server/timedetector/ServerFlags.java
index 7145f5e..fe977f8 100644
--- a/services/core/java/com/android/server/timedetector/ServerFlags.java
+++ b/services/core/java/com/android/server/timedetector/ServerFlags.java
@@ -50,10 +50,6 @@
/**
* An annotation used to indicate when a {@link DeviceConfig#NAMESPACE_SYSTEM_TIME} key is
* required.
- *
- * <p>Note that the com.android.geotz module deployment of the Offline LocationTimeZoneProvider
- * also shares the {@link DeviceConfig#NAMESPACE_SYSTEM_TIME}, and uses the
- * prefix "geotz_" on all of its key strings.
*/
@StringDef(prefix = "KEY_", value = {
KEY_LOCATION_TIME_ZONE_DETECTION_FEATURE_SUPPORTED,
diff --git a/services/core/java/com/android/server/wm/ActivityStartController.java b/services/core/java/com/android/server/wm/ActivityStartController.java
index 7257478..b6f2f24 100644
--- a/services/core/java/com/android/server/wm/ActivityStartController.java
+++ b/services/core/java/com/android/server/wm/ActivityStartController.java
@@ -16,6 +16,7 @@
package com.android.server.wm;
+import static android.app.ActivityManager.START_CANCELED;
import static android.app.ActivityManager.START_SUCCESS;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME;
import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
@@ -390,15 +391,18 @@
0 /* startFlags */, null /* profilerInfo */, userId, filterCallingUid);
aInfo = mService.mAmInternal.getActivityInfoForUser(aInfo, userId);
- // Carefully collect grants without holding lock
if (aInfo != null) {
- intentGrants = mSupervisor.mService.mUgmInternal
- .checkGrantUriPermissionFromIntent(intent, filterCallingUid,
- aInfo.applicationInfo.packageName,
- UserHandle.getUserId(aInfo.applicationInfo.uid));
- }
+ try {
+ // Carefully collect grants without holding lock
+ intentGrants = mSupervisor.mService.mUgmInternal
+ .checkGrantUriPermissionFromIntent(intent, filterCallingUid,
+ aInfo.applicationInfo.packageName,
+ UserHandle.getUserId(aInfo.applicationInfo.uid));
+ } catch (SecurityException e) {
+ Slog.d(TAG, "Not allowed to start activity since no uri permission.");
+ return START_CANCELED;
+ }
- if (aInfo != null) {
if ((aInfo.applicationInfo.privateFlags
& ApplicationInfo.PRIVATE_FLAG_CANT_SAVE_STATE) != 0) {
throw new IllegalArgumentException(
diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
index 569c11b..899266d 100644
--- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
+++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
@@ -2633,10 +2633,11 @@
}
final ActivityInfo ainfo = AppGlobals.getPackageManager().getActivityInfo(comp,
STOCK_PM_FLAGS, UserHandle.getUserId(callingUid));
- if (ainfo.applicationInfo.uid != callingUid) {
- throw new SecurityException(
- "Can't add task for another application: target uid="
- + ainfo.applicationInfo.uid + ", calling uid=" + callingUid);
+ if (ainfo == null || ainfo.applicationInfo.uid != callingUid) {
+ Slog.e(TAG, "Can't add task for another application: target uid="
+ + (ainfo == null ? Process.INVALID_UID : ainfo.applicationInfo.uid)
+ + ", calling uid=" + callingUid);
+ return INVALID_TASK_ID;
}
final Task rootTask = r.getRootTask();
@@ -4158,21 +4159,21 @@
/**
* Update the asset configuration and increase the assets sequence number.
- * @param processes the processes that needs to update the asset configuration
+ * @param processes the processes that needs to update the asset configuration, if none
+ * updates the global configuration for all processes.
*/
- public void updateAssetConfiguration(List<WindowProcessController> processes,
- boolean updateFrameworkRes) {
+ public void updateAssetConfiguration(List<WindowProcessController> processes) {
synchronized (mGlobalLock) {
final int assetSeq = increaseAssetConfigurationSeq();
- if (updateFrameworkRes) {
+ // Update the global configuration if the no target processes
+ if (processes == null) {
Configuration newConfig = new Configuration();
newConfig.assetsSeq = assetSeq;
updateConfiguration(newConfig);
+ return;
}
- // Always update the override of every process so the asset sequence of the process is
- // always greater than or equal to the global configuration.
for (int i = processes.size() - 1; i >= 0; i--) {
final WindowProcessController wpc = processes.get(i);
wpc.updateAssetConfiguration(assetSeq);
diff --git a/services/core/java/com/android/server/wm/AppTransitionController.java b/services/core/java/com/android/server/wm/AppTransitionController.java
index 4acadb2..3dea686 100644
--- a/services/core/java/com/android/server/wm/AppTransitionController.java
+++ b/services/core/java/com/android/server/wm/AppTransitionController.java
@@ -412,7 +412,13 @@
return TRANSIT_OLD_TASK_CLOSE;
}
if (isActivityClosing) {
- return TRANSIT_OLD_ACTIVITY_CLOSE;
+ for (int i = closingApps.size() - 1; i >= 0; i--) {
+ if (closingApps.valueAt(i).visibleIgnoringKeyguard) {
+ return TRANSIT_OLD_ACTIVITY_CLOSE;
+ }
+ }
+ // Skip close activity transition since no closing app can be visible
+ return WindowManager.TRANSIT_OLD_UNSET;
}
}
if (appTransition.containsTransitRequest(TRANSIT_RELAUNCH)
diff --git a/services/core/java/com/android/server/wm/DisplayArea.java b/services/core/java/com/android/server/wm/DisplayArea.java
index b24ab93..baa27e3 100644
--- a/services/core/java/com/android/server/wm/DisplayArea.java
+++ b/services/core/java/com/android/server/wm/DisplayArea.java
@@ -551,7 +551,13 @@
}
final WindowManagerPolicy policy = mWmService.mPolicy;
if (policy.isKeyguardHostWindow(w.mAttrs)) {
- if (mWmService.mKeyguardGoingAway) {
+ // Ignore the orientation of keyguard if it is going away or is not showing while
+ // the device is fully awake. In other words, use the orientation of keyguard if
+ // its window is visible while the device is going to sleep or is sleeping.
+ if (!mWmService.mAtmService.isKeyguardLocked()
+ && mDisplayContent.getDisplayPolicy().isAwake()
+ // Device is not going to sleep.
+ && policy.okToAnimate(true /* ignoreScreenOn */)) {
return false;
}
// Consider unoccluding only when all unknown visibilities have been
diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java
index 3dbc517..62d8ace 100644
--- a/services/core/java/com/android/server/wm/DisplayContent.java
+++ b/services/core/java/com/android/server/wm/DisplayContent.java
@@ -1564,12 +1564,6 @@
// window was transferred ({@link #mSkipAppTransitionAnimation}).
return false;
}
- if ((mAppTransition.getTransitFlags()
- & WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY_NO_ANIMATION) != 0) {
- // The transition may be finished before keyguard hidden. In order to avoid the
- // intermediate orientation change, it is more stable to freeze the display.
- return false;
- }
if (r.isState(RESUMED) && !r.getRootTask().mInResumeTopActivity) {
// If the activity is executing or has done the lifecycle callback, use normal
// rotation animation so the display info can be updated immediately (see
diff --git a/services/core/java/com/android/server/wm/KeyguardController.java b/services/core/java/com/android/server/wm/KeyguardController.java
index f8238c1..3208ae3 100644
--- a/services/core/java/com/android/server/wm/KeyguardController.java
+++ b/services/core/java/com/android/server/wm/KeyguardController.java
@@ -72,7 +72,6 @@
private boolean mAodShowing;
private boolean mKeyguardGoingAway;
private boolean mDismissalRequested;
- private int mBeforeUnoccludeTransit;
private final SparseArray<KeyguardDisplayState> mDisplayStates = new SparseArray<>();
private final ActivityTaskManagerService mService;
private RootWindowContainer mRootWindowContainer;
@@ -191,14 +190,11 @@
// Irrelevant to AOD.
dismissMultiWindowModeForTaskIfNeeded(null /* currentTaskControllsingOcclusion */,
false /* turningScreenOn */);
- setKeyguardGoingAway(false);
+ mKeyguardGoingAway = false;
if (keyguardShowing) {
mDismissalRequested = false;
}
}
- // TODO(b/113840485): Check usage for non-default display
- mWindowManager.setKeyguardOrAodShowingOnDefaultDisplay(
- isKeyguardOrAodShowing(DEFAULT_DISPLAY));
// Update the sleep token first such that ensureActivitiesVisible has correct sleep token
// state when evaluating visibilities.
@@ -219,8 +215,8 @@
}
Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "keyguardGoingAway");
mService.deferWindowLayout();
+ mKeyguardGoingAway = true;
try {
- setKeyguardGoingAway(true);
EventLogTags.writeWmSetKeyguardShown(
1 /* keyguardShowing */,
mAodShowing ? 1 : 0,
@@ -258,11 +254,6 @@
mWindowManager.dismissKeyguard(callback, message);
}
- private void setKeyguardGoingAway(boolean keyguardGoingAway) {
- mKeyguardGoingAway = keyguardGoingAway;
- mWindowManager.setKeyguardGoingAway(keyguardGoingAway);
- }
-
private void failCallback(IKeyguardDismissCallback callback) {
try {
callback.onDismissError();
diff --git a/services/core/java/com/android/server/wm/TaskSnapshotController.java b/services/core/java/com/android/server/wm/TaskSnapshotController.java
index 0000f95..e743710 100644
--- a/services/core/java/com/android/server/wm/TaskSnapshotController.java
+++ b/services/core/java/com/android/server/wm/TaskSnapshotController.java
@@ -644,7 +644,7 @@
/** Called when the device is going to sleep (e.g. screen off, AOD without screen off). */
void snapshotForSleeping(int displayId) {
- if (shouldDisableSnapshots()) {
+ if (shouldDisableSnapshots() || !mService.mDisplayEnabled) {
return;
}
final DisplayContent displayContent = mService.mRoot.getDisplayContent(displayId);
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index 147260b..1075806 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -483,10 +483,7 @@
private final DisplayAreaPolicy.Provider mDisplayAreaPolicyProvider;
final private KeyguardDisableHandler mKeyguardDisableHandler;
- // TODO: eventually unify all keyguard state in a common place instead of having it spread over
- // AM's KeyguardController and the policy's KeyguardServiceDelegate.
- boolean mKeyguardGoingAway;
- boolean mKeyguardOrAodShowingOnDefaultDisplay;
+
// VR Vr2d Display Id.
int mVr2dDisplayId = INVALID_DISPLAY;
boolean mVrModeEnabled = false;
@@ -3072,17 +3069,6 @@
mAtmInternal.notifyKeyguardFlagsChanged(callback, displayId);
}
- public void setKeyguardGoingAway(boolean keyguardGoingAway) {
- synchronized (mGlobalLock) {
- mKeyguardGoingAway = keyguardGoingAway;
- }
- }
-
- public void setKeyguardOrAodShowingOnDefaultDisplay(boolean showing) {
- synchronized (mGlobalLock) {
- mKeyguardOrAodShowingOnDefaultDisplay = showing;
- }
- }
// -------------------------------------------------------------
// Misc IWindowSession methods
diff --git a/services/core/jni/com_android_server_pm_PackageManagerShellCommandDataLoader.cpp b/services/core/jni/com_android_server_pm_PackageManagerShellCommandDataLoader.cpp
index f439777..7513512 100644
--- a/services/core/jni/com_android_server_pm_PackageManagerShellCommandDataLoader.cpp
+++ b/services/core/jni/com_android_server_pm_PackageManagerShellCommandDataLoader.cpp
@@ -133,8 +133,12 @@
static int waitForDataOrSignal(int fd, int event_fd) {
struct pollfd pfds[2] = {{fd, POLLIN, 0}, {event_fd, POLLIN, 0}};
- // Wait indefinitely until either data is ready or stop signal is received
+ // Wait until either data is ready or stop signal is received
int res = poll(pfds, 2, PollTimeoutMs);
+ if (res == -1 && errno == EINTR) {
+ // Treat it the same as timeout and allow the caller to retry.
+ return 0;
+ }
if (res <= 0) {
return res;
}
diff --git a/services/incremental/IncrementalService.cpp b/services/incremental/IncrementalService.cpp
index 757c9de..0e96567 100644
--- a/services/incremental/IncrementalService.cpp
+++ b/services/incremental/IncrementalService.cpp
@@ -91,7 +91,7 @@
static constexpr auto readLogsMaxInterval = 2h;
// How long should we wait till dataLoader reports destroyed.
- static constexpr auto destroyTimeout = 60s;
+ static constexpr auto destroyTimeout = 10s;
static constexpr auto anyStatus = INT_MIN;
};
diff --git a/services/tests/PackageManagerServiceTests/host/src/com/android/server/pm/test/BootTest.kt b/services/tests/PackageManagerServiceTests/host/src/com/android/server/pm/test/BootTest.kt
new file mode 100644
index 0000000..7fb4907
--- /dev/null
+++ b/services/tests/PackageManagerServiceTests/host/src/com/android/server/pm/test/BootTest.kt
@@ -0,0 +1,77 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.pm.test
+
+import com.android.tradefed.testtype.DeviceJUnit4ClassRunner
+import com.android.tradefed.testtype.junit4.BaseHostJUnit4Test
+import com.google.common.truth.Truth
+import org.junit.After
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+import org.junit.rules.TemporaryFolder
+import org.junit.runner.RunWith
+
+@RunWith(DeviceJUnit4ClassRunner::class)
+class BootTest : BaseHostJUnit4Test() {
+ companion object {
+ private const val TEST_PKG_NAME = "com.android.server.pm.test.test_app"
+ private const val TEST_APK_NAME = "PackageManagerTestAppStub.apk"
+ }
+
+ @Rule
+ @JvmField
+ val tempFolder = TemporaryFolder()
+
+ @Before
+ fun installApk() {
+ val testApkFile = HostUtils.copyResourceToHostFile(TEST_APK_NAME, tempFolder.newFile())
+ device.installPackage(testApkFile, true)
+ }
+
+ @After
+ fun removeApk() {
+ device.uninstallPackage(TEST_PKG_NAME)
+ }
+
+ @Test
+ fun testUninstallPackageWithKeepDataAndReboot() {
+ Truth.assertThat(isPackageInstalled(TEST_PKG_NAME)).isTrue()
+ uninstallPackageWithKeepData(TEST_PKG_NAME)
+ Truth.assertThat(isPackageInstalled(TEST_PKG_NAME)).isFalse()
+ device.rebootUntilOnline()
+ waitForBootCompleted()
+ }
+
+ private fun uninstallPackageWithKeepData(packageName: String) {
+ device.executeShellCommand("pm uninstall -k $packageName")
+ }
+
+ private fun waitForBootCompleted() {
+ for (i in 0 until 45) {
+ if (isBootCompleted()) {
+ return
+ }
+ Thread.sleep(1000)
+ }
+ throw AssertionError("System failed to become ready!")
+ }
+
+ private fun isBootCompleted(): Boolean {
+ return "1" == device.executeShellCommand("getprop sys.boot_completed").trim()
+ }
+}
\ No newline at end of file
diff --git a/services/tests/PackageManagerServiceTests/host/src/com/android/server/pm/test/SystemStubMultiUserDisableUninstallTest.kt b/services/tests/PackageManagerServiceTests/host/src/com/android/server/pm/test/SystemStubMultiUserDisableUninstallTest.kt
index 46120af..45e0d09 100644
--- a/services/tests/PackageManagerServiceTests/host/src/com/android/server/pm/test/SystemStubMultiUserDisableUninstallTest.kt
+++ b/services/tests/PackageManagerServiceTests/host/src/com/android/server/pm/test/SystemStubMultiUserDisableUninstallTest.kt
@@ -281,7 +281,7 @@
assertState(
primaryInstalled = false, primaryEnabled = true,
secondaryInstalled = true, secondaryEnabled = true,
- codePaths = listOf(CodePath.DIFFERENT, CodePath.SYSTEM)
+ codePaths = listOf(CodePath.SAME, CodePath.SYSTEM)
)
uninstall(User.SECONDARY)
@@ -289,7 +289,7 @@
assertState(
primaryInstalled = false, primaryEnabled = true,
secondaryInstalled = false, secondaryEnabled = true,
- codePaths = listOf(CodePath.DIFFERENT, CodePath.SYSTEM)
+ codePaths = listOf(CodePath.SAME, CodePath.SYSTEM)
)
installExisting(User.PRIMARY)
@@ -311,20 +311,20 @@
@Test
fun uninstallSecondaryFirstByUserAndInstallExistingSecondaryFirst() {
+ uninstall(User.SECONDARY)
+
+ assertState(
+ primaryInstalled = true, primaryEnabled = true,
+ secondaryInstalled = false, secondaryEnabled = true,
+ codePaths = listOf(CodePath.SAME, CodePath.SYSTEM)
+ )
+
uninstall(User.PRIMARY)
assertState(
primaryInstalled = false, primaryEnabled = true,
- secondaryInstalled = true, secondaryEnabled = true,
- codePaths = listOf(CodePath.DIFFERENT, CodePath.SYSTEM)
- )
-
- uninstall(User.SECONDARY)
-
- assertState(
- primaryInstalled = false, primaryEnabled = true,
secondaryInstalled = false, secondaryEnabled = true,
- codePaths = listOf(CodePath.DIFFERENT, CodePath.SYSTEM)
+ codePaths = listOf(CodePath.SAME, CodePath.SYSTEM)
)
installExisting(User.SECONDARY)
@@ -348,15 +348,14 @@
fun uninstallUpdatesAndEnablePrimaryFirst() {
device.executeShellCommand("pm uninstall-system-updates $TEST_PKG_NAME")
- // Uninstall-system-updates always disables system user 0
- // TODO: Is this intentional? There is no user argument for this command.
assertState(
- primaryInstalled = true, primaryEnabled = false,
+ primaryInstalled = true, primaryEnabled = true,
secondaryInstalled = true, secondaryEnabled = true,
// If any user is enabled when uninstalling updates, /data is re-uncompressed
codePaths = listOf(CodePath.DIFFERENT, CodePath.SYSTEM)
)
+ toggleEnabled(false, User.PRIMARY)
toggleEnabled(true, User.PRIMARY)
assertState(
@@ -379,14 +378,15 @@
fun uninstallUpdatesAndEnableSecondaryFirst() {
device.executeShellCommand("pm uninstall-system-updates $TEST_PKG_NAME")
- // Uninstall-system-updates always disables system user 0
assertState(
- primaryInstalled = true, primaryEnabled = false,
+ primaryInstalled = true, primaryEnabled = true,
secondaryInstalled = true, secondaryEnabled = true,
// If any user is enabled when uninstalling updates, /data is re-uncompressed
codePaths = listOf(CodePath.DIFFERENT, CodePath.SYSTEM)
)
+ toggleEnabled(false, User.PRIMARY)
+
toggleEnabled(true, User.SECONDARY)
assertState(
@@ -417,6 +417,7 @@
codePaths = listOf(CodePath.SYSTEM)
)
+ toggleEnabled(false, User.PRIMARY)
toggleEnabled(true, User.PRIMARY)
assertState(
@@ -447,6 +448,7 @@
codePaths = listOf(CodePath.SYSTEM)
)
+ toggleEnabled(false, User.PRIMARY)
toggleEnabled(true, User.SECONDARY)
assertState(
@@ -471,13 +473,13 @@
device.executeShellCommand("pm uninstall-system-updates $TEST_PKG_NAME")
- // Uninstall-system-updates always disables system user 0
assertState(
- primaryInstalled = false, primaryEnabled = false,
+ primaryInstalled = false, primaryEnabled = true,
secondaryInstalled = false, secondaryEnabled = true,
codePaths = listOf(CodePath.SYSTEM)
)
+ toggleEnabled(false, User.PRIMARY)
toggleEnabled(true, User.PRIMARY)
assertState(
@@ -502,9 +504,8 @@
device.executeShellCommand("pm uninstall-system-updates $TEST_PKG_NAME")
- // Uninstall-system-updates always disables system user 0
assertState(
- primaryInstalled = false, primaryEnabled = false,
+ primaryInstalled = false, primaryEnabled = true,
secondaryInstalled = false, secondaryEnabled = true,
codePaths = listOf(CodePath.SYSTEM)
)
@@ -512,7 +513,7 @@
toggleEnabled(true, User.SECONDARY)
assertState(
- primaryInstalled = false, primaryEnabled = false,
+ primaryInstalled = false, primaryEnabled = true,
secondaryInstalled = false, secondaryEnabled = true,
codePaths = listOf(CodePath.DIFFERENT, CodePath.SYSTEM)
)
@@ -582,22 +583,24 @@
codePaths: List<CodePath>
) {
HostUtils.getUserIdToPkgInstalledState(device, TEST_PKG_NAME)
- .forEach { (userId, installed) ->
- if (userId == 0) {
- assertThat(installed).isEqualTo(primaryInstalled)
- } else {
- assertThat(installed).isEqualTo(secondaryInstalled)
- }
+ .also { assertThat(it.size).isAtLeast(USER_COUNT) }
+ .forEach { (userId, installed) ->
+ if (userId == 0) {
+ assertThat(installed).isEqualTo(primaryInstalled)
+ } else {
+ assertThat(installed).isEqualTo(secondaryInstalled)
}
+ }
HostUtils.getUserIdToPkgEnabledState(device, TEST_PKG_NAME)
- .forEach { (userId, enabled) ->
- if (userId == 0) {
- assertThat(enabled).isEqualTo(primaryEnabled)
- } else {
- assertThat(enabled).isEqualTo(secondaryEnabled)
- }
+ .also { assertThat(it.size).isAtLeast(USER_COUNT) }
+ .forEach { (userId, enabled) ->
+ if (userId == 0) {
+ assertThat(enabled).isEqualTo(primaryEnabled)
+ } else {
+ assertThat(enabled).isEqualTo(secondaryEnabled)
}
+ }
assertCodePaths(codePaths.first(), codePaths.getOrNull(1))
}
diff --git a/services/tests/mockingservicestests/src/com/android/server/AppStateTrackerTest.java b/services/tests/mockingservicestests/src/com/android/server/AppStateTrackerTest.java
index 624e7dd..607fb47 100644
--- a/services/tests/mockingservicestests/src/com/android/server/AppStateTrackerTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/AppStateTrackerTest.java
@@ -1003,8 +1003,6 @@
verify(l, times(0)).updateAllJobs();
verify(l, times(0)).updateJobsForUid(anyInt(), anyBoolean());
verify(l, times(1)).updateJobsForUidPackage(eq(UID_10_2), eq(PACKAGE_2), anyBoolean());
- verify(l, times(1)).updateForceAppStandbyForUidPackage(eq(UID_10_2), eq(PACKAGE_2),
- eq(true));
verify(l, times(0)).updateAllAlarms();
verify(l, times(0)).updateAlarmsForUid(anyInt());
@@ -1019,8 +1017,6 @@
verify(l, times(0)).updateAllJobs();
verify(l, times(0)).updateJobsForUid(anyInt(), anyBoolean());
verify(l, times(1)).updateJobsForUidPackage(eq(UID_10_2), eq(PACKAGE_2), anyBoolean());
- verify(l, times(1)).updateForceAppStandbyForUidPackage(eq(UID_10_2), eq(PACKAGE_2),
- eq(false));
verify(l, times(0)).updateAllAlarms();
verify(l, times(0)).updateAlarmsForUid(anyInt());
@@ -1034,7 +1030,6 @@
verify(l, times(0)).updateAllJobs();
verify(l, times(0)).updateJobsForUid(anyInt(), anyBoolean());
verify(l, times(0)).updateJobsForUidPackage(anyInt(), anyString(), anyBoolean());
- verify(l, times(0)).updateForceAppStandbyForUidPackage(anyInt(), anyString(), anyBoolean());
verify(l, times(0)).updateAllAlarms();
verify(l, times(0)).updateAlarmsForUid(anyInt());
@@ -1052,8 +1047,6 @@
verify(l, times(1)).updateAllJobs();
verify(l, times(0)).updateJobsForUid(anyInt(), anyBoolean());
verify(l, times(1)).updateJobsForUidPackage(eq(UID_10_2), eq(PACKAGE_2), anyBoolean());
- verify(l, times(1)).updateForceAppStandbyForUidPackage(eq(UID_10_2), eq(PACKAGE_2),
- eq(true));
verify(l, times(1)).updateAllAlarms();
verify(l, times(0)).updateAlarmsForUid(anyInt());
@@ -1070,7 +1063,6 @@
verify(l, times(1)).updateAllJobs();
verify(l, times(0)).updateJobsForUid(anyInt(), anyBoolean());
verify(l, times(0)).updateJobsForUidPackage(anyInt(), anyString(), anyBoolean());
- verify(l, times(0)).updateForceAppStandbyForUidPackage(anyInt(), anyString(), anyBoolean());
verify(l, times(1)).updateAllAlarms();
verify(l, times(0)).updateAlarmsForUid(anyInt());
@@ -1089,7 +1081,6 @@
verify(l, times(1)).updateAllJobs();
verify(l, times(0)).updateJobsForUid(anyInt(), anyBoolean());
verify(l, times(0)).updateJobsForUidPackage(anyInt(), anyString(), anyBoolean());
- verify(l, times(0)).updateForceAppStandbyForUidPackage(anyInt(), anyString(), anyBoolean());
verify(l, times(1)).updateAllAlarms();
verify(l, times(0)).updateAlarmsForUid(anyInt());
@@ -1104,7 +1095,6 @@
verify(l, times(1)).updateAllJobs();
verify(l, times(0)).updateJobsForUid(anyInt(), anyBoolean());
verify(l, times(0)).updateJobsForUidPackage(anyInt(), anyString(), anyBoolean());
- verify(l, times(0)).updateForceAppStandbyForUidPackage(anyInt(), anyString(), anyBoolean());
verify(l, times(1)).updateAllAlarms();
verify(l, times(0)).updateAlarmsForUid(anyInt());
@@ -1121,7 +1111,6 @@
verify(l, times(1)).updateAllJobs();
verify(l, times(0)).updateJobsForUid(anyInt(), anyBoolean());
verify(l, times(0)).updateJobsForUidPackage(anyInt(), anyString(), anyBoolean());
- verify(l, times(0)).updateForceAppStandbyForUidPackage(anyInt(), anyString(), anyBoolean());
verify(l, times(0)).updateAllAlarms();
verify(l, times(0)).updateAlarmsForUid(anyInt());
@@ -1137,7 +1126,6 @@
verify(l, times(1)).updateAllJobs();
verify(l, times(0)).updateJobsForUid(anyInt(), anyBoolean());
verify(l, times(0)).updateJobsForUidPackage(anyInt(), anyString(), anyBoolean());
- verify(l, times(0)).updateForceAppStandbyForUidPackage(anyInt(), anyString(), anyBoolean());
verify(l, times(0)).updateAllAlarms();
verify(l, times(0)).updateAlarmsForUid(anyInt());
@@ -1154,7 +1142,6 @@
verify(l, times(1)).updateAllJobs();
verify(l, times(0)).updateJobsForUid(anyInt(), anyBoolean());
verify(l, times(0)).updateJobsForUidPackage(anyInt(), anyString(), anyBoolean());
- verify(l, times(0)).updateForceAppStandbyForUidPackage(anyInt(), anyString(), anyBoolean());
verify(l, times(1)).updateAllAlarms();
verify(l, times(0)).updateAlarmsForUid(anyInt());
@@ -1171,7 +1158,6 @@
verify(l, times(2)).updateAllJobs();
verify(l, times(0)).updateJobsForUid(anyInt(), anyBoolean());
verify(l, times(0)).updateJobsForUidPackage(anyInt(), anyString(), anyBoolean());
- verify(l, times(0)).updateForceAppStandbyForUidPackage(anyInt(), anyString(), anyBoolean());
verify(l, times(1)).updateAllAlarms();
verify(l, times(0)).updateAlarmsForUid(anyInt());
@@ -1186,7 +1172,6 @@
verify(l, times(1)).updateAllJobs();
verify(l, times(0)).updateJobsForUid(anyInt(), anyBoolean());
verify(l, times(0)).updateJobsForUidPackage(anyInt(), anyString(), anyBoolean());
- verify(l, times(0)).updateForceAppStandbyForUidPackage(anyInt(), anyString(), anyBoolean());
verify(l, times(1)).updateAllAlarms();
verify(l, times(0)).updateAlarmsForUid(anyInt());
@@ -1203,7 +1188,6 @@
verify(l, times(1)).updateAllJobs();
verify(l, times(0)).updateJobsForUid(anyInt(), anyBoolean());
verify(l, times(0)).updateJobsForUidPackage(anyInt(), anyString(), anyBoolean());
- verify(l, times(0)).updateForceAppStandbyForUidPackage(anyInt(), anyString(), anyBoolean());
verify(l, times(0)).updateAllAlarms();
verify(l, times(0)).updateAlarmsForUid(anyInt());
@@ -1219,7 +1203,6 @@
verify(l, times(1)).updateAllJobs();
verify(l, times(0)).updateJobsForUid(anyInt(), anyBoolean());
verify(l, times(0)).updateJobsForUidPackage(anyInt(), anyString(), anyBoolean());
- verify(l, times(0)).updateForceAppStandbyForUidPackage(anyInt(), anyString(), anyBoolean());
verify(l, times(0)).updateAllAlarms();
verify(l, times(0)).updateAlarmsForUid(anyInt());
@@ -1242,7 +1225,6 @@
verify(l, times(0)).updateAllJobs();
verify(l, times(1)).updateJobsForUid(eq(UID_10_1), anyBoolean());
verify(l, times(0)).updateJobsForUidPackage(anyInt(), anyString(), anyBoolean());
- verify(l, times(0)).updateForceAppStandbyForUidPackage(anyInt(), anyString(), anyBoolean());
verify(l, times(0)).updateAllAlarms();
verify(l, times(1)).updateAlarmsForUid(eq(UID_10_1));
@@ -1258,7 +1240,6 @@
verify(l, times(0)).updateAllJobs();
verify(l, times(1)).updateJobsForUid(eq(UID_10_1), anyBoolean());
verify(l, times(0)).updateJobsForUidPackage(anyInt(), anyString(), anyBoolean());
- verify(l, times(0)).updateForceAppStandbyForUidPackage(anyInt(), anyString(), anyBoolean());
verify(l, times(0)).updateAllAlarms();
verify(l, times(1)).updateAlarmsForUid(eq(UID_10_1));
@@ -1274,7 +1255,6 @@
verify(l, times(0)).updateAllJobs();
verify(l, times(1)).updateJobsForUid(eq(UID_10_1), anyBoolean());
verify(l, times(0)).updateJobsForUidPackage(anyInt(), anyString(), anyBoolean());
- verify(l, times(0)).updateForceAppStandbyForUidPackage(anyInt(), anyString(), anyBoolean());
verify(l, times(0)).updateAllAlarms();
verify(l, times(1)).updateAlarmsForUid(eq(UID_10_1));
@@ -1290,7 +1270,6 @@
verify(l, times(0)).updateAllJobs();
verify(l, times(1)).updateJobsForUid(eq(UID_10_1), anyBoolean());
verify(l, times(0)).updateJobsForUidPackage(anyInt(), anyString(), anyBoolean());
- verify(l, times(0)).updateForceAppStandbyForUidPackage(anyInt(), anyString(), anyBoolean());
verify(l, times(0)).updateAllAlarms();
verify(l, times(1)).updateAlarmsForUid(eq(UID_10_1));
@@ -1307,7 +1286,6 @@
verify(l, times(1)).updateAllJobs();
verify(l, times(0)).updateJobsForUid(eq(UID_10_1), anyBoolean());
verify(l, times(0)).updateJobsForUidPackage(anyInt(), anyString(), anyBoolean());
- verify(l, times(0)).updateForceAppStandbyForUidPackage(anyInt(), anyString(), anyBoolean());
verify(l, times(1)).updateAllAlarms();
verify(l, times(0)).updateAlarmsForUid(eq(UID_10_1));
@@ -1323,7 +1301,6 @@
verify(l, times(0)).updateAllJobs();
verify(l, times(1)).updateJobsForUid(eq(UID_10_1), anyBoolean());
verify(l, times(0)).updateJobsForUidPackage(anyInt(), anyString(), anyBoolean());
- verify(l, times(0)).updateForceAppStandbyForUidPackage(anyInt(), anyString(), anyBoolean());
verify(l, times(0)).updateAllAlarms();
verify(l, times(1)).updateAlarmsForUid(eq(UID_10_1));
@@ -1339,7 +1316,6 @@
verify(l, times(0)).updateAllJobs();
verify(l, times(1)).updateJobsForUid(eq(UID_10_1), anyBoolean());
verify(l, times(0)).updateJobsForUidPackage(anyInt(), anyString(), anyBoolean());
- verify(l, times(0)).updateForceAppStandbyForUidPackage(anyInt(), anyString(), anyBoolean());
verify(l, times(0)).updateAllAlarms();
verify(l, times(1)).updateAlarmsForUid(eq(UID_10_1));
@@ -1355,7 +1331,6 @@
verify(l, times(0)).updateAllJobs();
verify(l, times(1)).updateJobsForUid(eq(UID_10_1), anyBoolean());
verify(l, times(0)).updateJobsForUidPackage(anyInt(), anyString(), anyBoolean());
- verify(l, times(0)).updateForceAppStandbyForUidPackage(anyInt(), anyString(), anyBoolean());
verify(l, times(0)).updateAllAlarms();
verify(l, times(1)).updateAlarmsForUid(eq(UID_10_1));
@@ -1371,7 +1346,6 @@
verify(l, times(0)).updateAllJobs();
verify(l, times(1)).updateJobsForUid(eq(UID_10_1), anyBoolean());
verify(l, times(0)).updateJobsForUidPackage(anyInt(), anyString(), anyBoolean());
- verify(l, times(0)).updateForceAppStandbyForUidPackage(anyInt(), anyString(), anyBoolean());
verify(l, times(0)).updateAllAlarms();
verify(l, times(1)).updateAlarmsForUid(eq(UID_10_1));
diff --git a/services/tests/mockingservicestests/src/com/android/server/alarm/AlarmManagerServiceTest.java b/services/tests/mockingservicestests/src/com/android/server/alarm/AlarmManagerServiceTest.java
index eab1afb..583797e 100644
--- a/services/tests/mockingservicestests/src/com/android/server/alarm/AlarmManagerServiceTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/alarm/AlarmManagerServiceTest.java
@@ -1910,17 +1910,6 @@
assertTrue(mBinder.hasScheduleExactAlarm(TEST_CALLING_PACKAGE, TEST_CALLING_USER));
}
- @Test
- public void hasScheduleExactAlarmBinderCallChangeDisabled() throws RemoteException {
- mockChangeEnabled(AlarmManager.REQUIRE_EXACT_ALARM_PERMISSION, false);
-
- mockExactAlarmPermissionGrant(false, true, MODE_DEFAULT);
- assertTrue(mBinder.hasScheduleExactAlarm(TEST_CALLING_PACKAGE, TEST_CALLING_USER));
-
- mockExactAlarmPermissionGrant(true, false, MODE_ERRORED);
- assertTrue(mBinder.hasScheduleExactAlarm(TEST_CALLING_PACKAGE, TEST_CALLING_USER));
- }
-
private void mockChangeEnabled(long changeId, boolean enabled) {
doReturn(enabled).when(() -> CompatChanges.isChangeEnabled(eq(changeId), anyString(),
any(UserHandle.class)));
@@ -1941,6 +1930,53 @@
}
@Test
+ public void canScheduleExactAlarmsBinderCallChangeDisabled() throws RemoteException {
+ mockChangeEnabled(AlarmManager.REQUIRE_EXACT_ALARM_PERMISSION, false);
+
+ mockExactAlarmPermissionGrant(false, true, MODE_DEFAULT);
+ assertTrue(mBinder.canScheduleExactAlarms(TEST_CALLING_PACKAGE));
+
+ mockExactAlarmPermissionGrant(true, false, MODE_ERRORED);
+ assertTrue(mBinder.canScheduleExactAlarms(TEST_CALLING_PACKAGE));
+ }
+
+ @Test
+ public void canScheduleExactAlarmsBinderCall() throws RemoteException {
+ mockChangeEnabled(AlarmManager.REQUIRE_EXACT_ALARM_PERMISSION, true);
+
+ // No permission, no exemption.
+ mockExactAlarmPermissionGrant(true, true, MODE_DEFAULT);
+ assertFalse(mBinder.canScheduleExactAlarms(TEST_CALLING_PACKAGE));
+
+ // No permission, no exemption.
+ mockExactAlarmPermissionGrant(true, false, MODE_ERRORED);
+ assertFalse(mBinder.canScheduleExactAlarms(TEST_CALLING_PACKAGE));
+
+ // Permission, no exemption.
+ mockExactAlarmPermissionGrant(true, false, MODE_DEFAULT);
+ assertTrue(mBinder.canScheduleExactAlarms(TEST_CALLING_PACKAGE));
+
+ // Permission, no exemption.
+ mockExactAlarmPermissionGrant(true, true, MODE_ALLOWED);
+ assertTrue(mBinder.canScheduleExactAlarms(TEST_CALLING_PACKAGE));
+
+ // No permission, exemption.
+ mockExactAlarmPermissionGrant(true, false, MODE_ERRORED);
+ when(mDeviceIdleInternal.isAppOnWhitelist(TEST_CALLING_UID)).thenReturn(true);
+ assertTrue(mBinder.canScheduleExactAlarms(TEST_CALLING_PACKAGE));
+
+ // No permission, exemption.
+ mockExactAlarmPermissionGrant(true, false, MODE_ERRORED);
+ when(mDeviceIdleInternal.isAppOnWhitelist(TEST_CALLING_UID)).thenReturn(false);
+ doReturn(true).when(() -> UserHandle.isCore(TEST_CALLING_UID));
+ assertTrue(mBinder.canScheduleExactAlarms(TEST_CALLING_PACKAGE));
+
+ // Both permission and exemption.
+ mockExactAlarmPermissionGrant(true, false, MODE_ALLOWED);
+ assertTrue(mBinder.canScheduleExactAlarms(TEST_CALLING_PACKAGE));
+ }
+
+ @Test
public void noPermissionCheckWhenChangeDisabled() throws RemoteException {
mockChangeEnabled(AlarmManager.REQUIRE_EXACT_ALARM_PERMISSION, false);
@@ -2086,14 +2122,17 @@
final PendingIntent alarmPi = getNewMockPendingIntent();
final AlarmManager.AlarmClockInfo alarmClock = mock(AlarmManager.AlarmClockInfo.class);
- try {
- mBinder.set(TEST_CALLING_PACKAGE, RTC_WAKEUP, 1234, WINDOW_EXACT, 0, 0,
+ mBinder.set(TEST_CALLING_PACKAGE, RTC_WAKEUP, 1234, WINDOW_EXACT, 0, 0,
alarmPi, null, null, null, alarmClock);
- fail("alarm clock binder call succeeded without permission");
- } catch (SecurityException se) {
- // Expected.
- }
- verify(mDeviceIdleInternal, never()).isAppOnWhitelist(anyInt());
+
+ // Correct permission checks are invoked.
+ verify(mService).hasScheduleExactAlarmInternal(TEST_CALLING_PACKAGE, TEST_CALLING_UID);
+ verify(mDeviceIdleInternal).isAppOnWhitelist(UserHandle.getAppId(TEST_CALLING_UID));
+
+ verify(mService).setImpl(eq(RTC_WAKEUP), eq(1234L), eq(WINDOW_EXACT), eq(0L),
+ eq(alarmPi), isNull(), isNull(), eq(FLAG_STANDALONE | FLAG_WAKE_FROM_IDLE),
+ isNull(), eq(alarmClock), eq(TEST_CALLING_UID), eq(TEST_CALLING_PACKAGE),
+ isNull(), eq(EXACT_ALLOW_REASON_ALLOW_LIST));
}
@Test
diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityManagerTest.java b/services/tests/servicestests/src/com/android/server/am/ActivityManagerTest.java
index e19aa72..4b030d1 100644
--- a/services/tests/servicestests/src/com/android/server/am/ActivityManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/am/ActivityManagerTest.java
@@ -52,7 +52,6 @@
import android.support.test.uiautomator.UiDevice;
import android.test.suitebuilder.annotation.LargeTest;
import android.text.TextUtils;
-import android.util.KeyValueListParser;
import android.util.Log;
import androidx.test.InstrumentationRegistry;
@@ -421,142 +420,6 @@
return false;
}
- @LargeTest
- @Test
- public void testKillAppIfFasCachedIdle() throws Exception {
- final long shortTimeoutMs = 5_000;
- final long backgroundSettleMs = 10_000;
- final PackageManager pm = mContext.getPackageManager();
- final int uid = pm.getPackageUid(TEST_APP1, 0);
- final MyUidImportanceListener uidListener1 = new MyUidImportanceListener(uid);
- final MyUidImportanceListener uidListener2 = new MyUidImportanceListener(uid);
- SettingsSession<String> amConstantsSettings = null;
- DeviceConfigSession<Boolean> killForceAppStandByAndCachedIdle = null;
- final ActivityManager am = mContext.getSystemService(ActivityManager.class);
- final CountDownLatch[] latchHolder = new CountDownLatch[1];
- final H handler = new H(Looper.getMainLooper(), latchHolder);
- final Messenger messenger = new Messenger(handler);
- try {
- am.addOnUidImportanceListener(uidListener1,
- RunningAppProcessInfo.IMPORTANCE_FOREGROUND_SERVICE);
- am.addOnUidImportanceListener(uidListener2, RunningAppProcessInfo.IMPORTANCE_GONE);
- toggleScreenOn(true);
-
- killForceAppStandByAndCachedIdle = new DeviceConfigSession<>(
- DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
- ActivityManagerConstants.KEY_KILL_FAS_CACHED_IDLE,
- DeviceConfig::getBoolean,
- ActivityManagerConstants.DEFAULT_KILL_FAS_CACHED_IDLE);
- killForceAppStandByAndCachedIdle.set(true);
- amConstantsSettings = new SettingsSession<>(
- Settings.Global.getUriFor(Settings.Global.ACTIVITY_MANAGER_CONSTANTS),
- Settings.Global::getString, Settings.Global::putString);
- final KeyValueListParser parser = new KeyValueListParser(',');
- long currentBackgroundSettleMs =
- ActivityManagerConstants.DEFAULT_BACKGROUND_SETTLE_TIME;
- try {
- parser.setString(amConstantsSettings.get());
- currentBackgroundSettleMs = parser.getLong(
- ActivityManagerConstants.KEY_BACKGROUND_SETTLE_TIME,
- ActivityManagerConstants.DEFAULT_BACKGROUND_SETTLE_TIME);
- } catch (IllegalArgumentException e) {
- }
- // Drain queue to make sure the existing UID_IDLE_MSG has been processed.
- Thread.sleep(currentBackgroundSettleMs);
- amConstantsSettings.set(
- ActivityManagerConstants.KEY_BACKGROUND_SETTLE_TIME + "=" + backgroundSettleMs);
- runShellCommand("cmd appops set " + TEST_APP1 + " RUN_ANY_IN_BACKGROUND allow");
-
- final Intent intent = new Intent(ACTION_FGS_STATS_TEST);
- final ComponentName cn = ComponentName.unflattenFromString(
- TEST_APP1 + "/" + TEST_FGS_CLASS);
- final Bundle bundle = new Bundle();
- intent.setComponent(cn);
- bundle.putBinder(EXTRA_MESSENGER, messenger.getBinder());
- intent.putExtras(bundle);
-
- // Start the FGS.
- latchHolder[0] = new CountDownLatch(1);
- mContext.startForegroundService(intent);
- assertTrue("Timed out to start fg service", uidListener1.waitFor(
- RunningAppProcessInfo.IMPORTANCE_FOREGROUND_SERVICE, shortTimeoutMs));
- assertTrue("Timed out to get the remote messenger", latchHolder[0].await(
- shortTimeoutMs, TimeUnit.MILLISECONDS));
- assertFalse("FGS shouldn't be killed", uidListener2.waitFor(
- RunningAppProcessInfo.IMPORTANCE_GONE, backgroundSettleMs + shortTimeoutMs));
-
- // Stop the FGS, it shouldn't be killed because it's not in FAS state.
- latchHolder[0] = new CountDownLatch(1);
- handler.sendRemoteMessage(H.MSG_STOP_FOREGROUND, 0, 0, null);
- assertTrue("Timed out to wait for stop fg", latchHolder[0].await(
- shortTimeoutMs, TimeUnit.MILLISECONDS));
- assertFalse("FGS shouldn't be killed", uidListener2.waitFor(
- RunningAppProcessInfo.IMPORTANCE_GONE, backgroundSettleMs + shortTimeoutMs));
-
- // Set the FAS state.
- runShellCommand("cmd appops set " + TEST_APP1 + " RUN_ANY_IN_BACKGROUND deny");
- // Now it should've been killed.
- assertTrue("Should have been killed", uidListener2.waitFor(
- RunningAppProcessInfo.IMPORTANCE_GONE, backgroundSettleMs + shortTimeoutMs));
-
- // Start the FGS.
- // Temporarily allow RUN_ANY_IN_BACKGROUND to start FGS.
- runShellCommand("cmd appops set " + TEST_APP1 + " RUN_ANY_IN_BACKGROUND allow");
- latchHolder[0] = new CountDownLatch(1);
- mContext.startForegroundService(intent);
- assertTrue("Timed out to start fg service", uidListener1.waitFor(
- RunningAppProcessInfo.IMPORTANCE_FOREGROUND_SERVICE, shortTimeoutMs));
- assertTrue("Timed out to get the remote messenger", latchHolder[0].await(
- shortTimeoutMs, TimeUnit.MILLISECONDS));
- runShellCommand("cmd appops set " + TEST_APP1 + " RUN_ANY_IN_BACKGROUND deny");
- // It shouldn't be killed since it's not cached.
- assertFalse("FGS shouldn't be killed", uidListener2.waitFor(
- RunningAppProcessInfo.IMPORTANCE_GONE, backgroundSettleMs + shortTimeoutMs));
-
- // Stop the FGS, it should get killed because it's cached & uid idle & in FAS state.
- latchHolder[0] = new CountDownLatch(1);
- handler.sendRemoteMessage(H.MSG_STOP_FOREGROUND, 0, 0, null);
- assertTrue("Timed out to wait for stop fg", latchHolder[0].await(
- shortTimeoutMs, TimeUnit.MILLISECONDS));
- assertTrue("Should have been killed", uidListener2.waitFor(
- RunningAppProcessInfo.IMPORTANCE_GONE, backgroundSettleMs + shortTimeoutMs));
-
- // Disable this FAS cached idle kill feature.
- killForceAppStandByAndCachedIdle.set(false);
-
- // Start the FGS.
- // Temporarily allow RUN_ANY_IN_BACKGROUND to start FGS.
- runShellCommand("cmd appops set " + TEST_APP1 + " RUN_ANY_IN_BACKGROUND allow");
- latchHolder[0] = new CountDownLatch(1);
- mContext.startForegroundService(intent);
- assertTrue("Timed out to start fg service", uidListener1.waitFor(
- RunningAppProcessInfo.IMPORTANCE_FOREGROUND_SERVICE, shortTimeoutMs));
- assertTrue("Timed out to get the remote messenger", latchHolder[0].await(
- shortTimeoutMs, TimeUnit.MILLISECONDS));
- runShellCommand("cmd appops set " + TEST_APP1 + " RUN_ANY_IN_BACKGROUND deny");
- assertFalse("FGS shouldn't be killed", uidListener2.waitFor(
- RunningAppProcessInfo.IMPORTANCE_GONE, backgroundSettleMs + shortTimeoutMs));
-
- // Stop the FGS, it shouldn't be killed because the feature has been turned off.
- latchHolder[0] = new CountDownLatch(1);
- handler.sendRemoteMessage(H.MSG_STOP_FOREGROUND, 0, 0, null);
- assertTrue("Timed out to wait for stop fg", latchHolder[0].await(
- shortTimeoutMs, TimeUnit.MILLISECONDS));
- assertFalse("FGS shouldn't be killed", uidListener2.waitFor(
- RunningAppProcessInfo.IMPORTANCE_GONE, backgroundSettleMs + shortTimeoutMs));
- } finally {
- runShellCommand("cmd appops set " + TEST_APP1 + " RUN_ANY_IN_BACKGROUND default");
- if (amConstantsSettings != null) {
- amConstantsSettings.close();
- }
- if (killForceAppStandByAndCachedIdle != null) {
- killForceAppStandByAndCachedIdle.close();
- }
- am.removeOnUidImportanceListener(uidListener1);
- am.removeOnUidImportanceListener(uidListener2);
- }
- }
-
@Ignore("Need to disable calling uid check in ActivityManagerService.killPids before this test")
@Test
public void testKillPids() throws Exception {
diff --git a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceTest.java b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceTest.java
index 6880302..6502e48 100644
--- a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceTest.java
+++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceTest.java
@@ -32,9 +32,15 @@
import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+
import android.content.Context;
import android.hardware.hdmi.HdmiControlManager;
import android.hardware.hdmi.HdmiPortInfo;
+import android.media.AudioManager;
import android.os.test.TestLooper;
import android.platform.test.annotations.Presubmit;
@@ -45,6 +51,8 @@
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
import java.util.ArrayList;
import java.util.Arrays;
@@ -123,8 +131,12 @@
private boolean isControlEnabled;
private int mPowerStatus;
+ @Mock
+ private AudioManager mAudioManager;
+
@Before
public void SetUp() {
+ MockitoAnnotations.initMocks(this);
Context context = InstrumentationRegistry.getTargetContext();
@@ -161,6 +173,11 @@
void wakeUp() {
mWakeupMessageReceived = true;
}
+
+ @Override
+ AudioManager getAudioManager() {
+ return mAudioManager;
+ }
};
mHdmiControlService.setIoLooper(mTestLooper.getLooper());
mHdmiControlService.setHdmiCecConfig(new FakeHdmiCecConfig(context));
@@ -419,6 +436,28 @@
}
@Test
+ public void handleUserControlPressed_muteFunction() {
+ @Constants.HandleMessageResult int result = mHdmiLocalDevice.handleUserControlPressed(
+ HdmiCecMessageBuilder.buildUserControlPressed(ADDR_TV, ADDR_PLAYBACK_1,
+ HdmiCecKeycode.CEC_KEYCODE_MUTE_FUNCTION));
+
+ assertEquals(result, Constants.HANDLED);
+ verify(mAudioManager, times(1))
+ .adjustStreamVolume(anyInt(), eq(AudioManager.ADJUST_MUTE), anyInt());
+ }
+
+ @Test
+ public void handleUserControlPressed_restoreVolumeFunction() {
+ @Constants.HandleMessageResult int result = mHdmiLocalDevice.handleUserControlPressed(
+ HdmiCecMessageBuilder.buildUserControlPressed(ADDR_TV, ADDR_PLAYBACK_1,
+ HdmiCecKeycode.CEC_KEYCODE_RESTORE_VOLUME_FUNCTION));
+
+ assertEquals(result, Constants.HANDLED);
+ verify(mAudioManager, times(1))
+ .adjustStreamVolume(anyInt(), eq(AudioManager.ADJUST_UNMUTE), anyInt());
+ }
+
+ @Test
public void handleVendorCommand_notHandled() {
HdmiCecMessage vendorCommand = HdmiCecMessageBuilder.buildVendorCommand(ADDR_TV,
ADDR_PLAYBACK_1, new byte[]{0});
diff --git a/services/tests/wmtests/src/com/android/server/wm/AppTransitionControllerTest.java b/services/tests/wmtests/src/com/android/server/wm/AppTransitionControllerTest.java
index 57cf865..c555612 100644
--- a/services/tests/wmtests/src/com/android/server/wm/AppTransitionControllerTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/AppTransitionControllerTest.java
@@ -78,6 +78,24 @@
}
@Test
+ public void testSkipOccludedActivityCloseTransition() {
+ final ActivityRecord behind = createActivityRecord(mDisplayContent,
+ WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD);
+ final ActivityRecord topOpening = createActivityRecord(behind.getTask());
+ topOpening.setOccludesParent(true);
+ topOpening.setVisible(true);
+
+ mDisplayContent.prepareAppTransition(TRANSIT_OPEN);
+ mDisplayContent.prepareAppTransition(TRANSIT_CLOSE);
+ mDisplayContent.mClosingApps.add(behind);
+
+ assertEquals(WindowManager.TRANSIT_OLD_UNSET,
+ AppTransitionController.getTransitCompatType(mDisplayContent.mAppTransition,
+ mDisplayContent.mOpeningApps, mDisplayContent.mClosingApps,
+ null, null, false));
+ }
+
+ @Test
@FlakyTest(bugId = 131005232)
public void testTranslucentOpen() {
final ActivityRecord behind = createActivityRecord(mDisplayContent,
diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java
index 5bc4c82..d498d46 100644
--- a/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java
@@ -100,7 +100,6 @@
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.doCallRealMethod;
-import android.annotation.SuppressLint;
import android.app.ActivityTaskManager;
import android.app.WindowConfiguration;
import android.app.servertransaction.FixedRotationAdjustmentsItem;
@@ -792,15 +791,9 @@
}
@Test
- @SuppressLint("InlinedApi")
public void testOrientationDefinedByKeyguard() {
- final DisplayContent dc = createNewDisplay();
-
- // When display content is created its configuration is not yet initialized, which could
- // cause unnecessary configuration propagation, so initialize it here.
- final Configuration config = new Configuration();
- dc.computeScreenConfiguration(config);
- dc.onRequestedOverrideConfigurationChanged(config);
+ final DisplayContent dc = mDisplayContent;
+ dc.getDisplayPolicy().setAwake(true);
// Create a window that requests landscape orientation. It will define device orientation
// by default.
@@ -815,10 +808,12 @@
SCREEN_ORIENTATION_LANDSCAPE, dc.getOrientation());
keyguard.mAttrs.screenOrientation = SCREEN_ORIENTATION_PORTRAIT;
+ mAtm.mKeyguardController.setKeyguardShown(true /* keyguardShowing */,
+ false /* aodShowing */);
assertEquals("Visible keyguard must influence device orientation",
SCREEN_ORIENTATION_PORTRAIT, dc.getOrientation());
- mWm.setKeyguardGoingAway(true);
+ mAtm.mKeyguardController.keyguardGoingAway(0 /* flags */);
assertEquals("Keyguard that is going away must not influence device orientation",
SCREEN_ORIENTATION_LANDSCAPE, dc.getOrientation());
}
diff --git a/services/tests/wmtests/src/com/android/server/wm/RefreshRatePolicyTest.java b/services/tests/wmtests/src/com/android/server/wm/RefreshRatePolicyTest.java
index 20b987d..e169692 100644
--- a/services/tests/wmtests/src/com/android/server/wm/RefreshRatePolicyTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/RefreshRatePolicyTest.java
@@ -24,9 +24,11 @@
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
+import android.os.Parcel;
import android.platform.test.annotations.Presubmit;
import android.view.Display.Mode;
import android.view.DisplayInfo;
+import android.view.WindowManager.LayoutParams;
import androidx.test.filters.FlakyTest;
import androidx.test.filters.SmallTest;
@@ -50,6 +52,16 @@
private RefreshRatePolicy mPolicy;
private HighRefreshRateDenylist mDenylist = mock(HighRefreshRateDenylist.class);
+ // Parcel and Unparcel the LayoutParams in the window state to test the path the object
+ // travels from the app's process to system server
+ void parcelLayoutParams(WindowState window) {
+ Parcel parcel = Parcel.obtain();
+ window.mAttrs.writeToParcel(parcel, 0);
+ parcel.setDataPosition(0);
+ window.mAttrs.copyFrom(new LayoutParams(parcel));
+ parcel.recycle();
+ }
+
@Before
public void setUp() {
DisplayInfo di = new DisplayInfo(mDisplayInfo);
@@ -69,6 +81,7 @@
final WindowState cameraUsingWindow = createWindow(null, TYPE_BASE_APPLICATION,
"cameraUsingWindow");
cameraUsingWindow.mAttrs.packageName = "com.android.test";
+ parcelLayoutParams(cameraUsingWindow);
assertEquals(0, mPolicy.getPreferredModeId(cameraUsingWindow));
assertEquals(0, mPolicy.getPreferredRefreshRate(cameraUsingWindow), FLOAT_TOLERANCE);
assertEquals(0, mPolicy.getPreferredMaxRefreshRate(cameraUsingWindow), FLOAT_TOLERANCE);
@@ -86,6 +99,7 @@
final WindowState denylistedWindow = createWindow(null, TYPE_BASE_APPLICATION,
"denylistedWindow");
denylistedWindow.mAttrs.packageName = "com.android.test";
+ parcelLayoutParams(denylistedWindow);
when(mDenylist.isDenylisted("com.android.test")).thenReturn(true);
assertEquals(0, mPolicy.getPreferredModeId(denylistedWindow));
assertEquals(60, mPolicy.getPreferredRefreshRate(denylistedWindow), FLOAT_TOLERANCE);
@@ -97,6 +111,7 @@
"overrideWindow");
overrideWindow.mAttrs.packageName = "com.android.test";
overrideWindow.mAttrs.preferredDisplayModeId = LOW_MODE_ID;
+ parcelLayoutParams(overrideWindow);
when(mDenylist.isDenylisted("com.android.test")).thenReturn(true);
assertEquals(LOW_MODE_ID, mPolicy.getPreferredModeId(overrideWindow));
assertEquals(60, mPolicy.getPreferredRefreshRate(overrideWindow), FLOAT_TOLERANCE);
@@ -108,6 +123,7 @@
"overrideWindow");
overrideWindow.mAttrs.packageName = "com.android.test";
overrideWindow.mAttrs.preferredDisplayModeId = LOW_MODE_ID;
+ parcelLayoutParams(overrideWindow);
mPolicy.addNonHighRefreshRatePackage("com.android.test");
assertEquals(LOW_MODE_ID, mPolicy.getPreferredModeId(overrideWindow));
assertEquals(0, mPolicy.getPreferredRefreshRate(overrideWindow), FLOAT_TOLERANCE);
@@ -120,6 +136,7 @@
"overrideWindow");
overrideWindow.mAttrs.packageName = "com.android.test";
overrideWindow.mAttrs.preferredDisplayModeId = LOW_MODE_ID;
+ parcelLayoutParams(overrideWindow);
overrideWindow.mActivityRecord.mSurfaceAnimator.startAnimation(
overrideWindow.getPendingTransaction(), mock(AnimationAdapter.class),
false /* hidden */, ANIMATION_TYPE_APP_TRANSITION);
@@ -134,6 +151,7 @@
final WindowState cameraUsingWindow = createWindow(null, TYPE_BASE_APPLICATION,
"cameraUsingWindow");
cameraUsingWindow.mAttrs.packageName = "com.android.test";
+ parcelLayoutParams(cameraUsingWindow);
mPolicy.addNonHighRefreshRatePackage("com.android.test");
assertEquals(0, mPolicy.getPreferredModeId(cameraUsingWindow));
@@ -152,6 +170,7 @@
public void testAppMaxRefreshRate() {
final WindowState window = createWindow(null, TYPE_BASE_APPLICATION, "window");
window.mAttrs.preferredMaxDisplayRefreshRate = 60f;
+ parcelLayoutParams(window);
assertEquals(0, mPolicy.getPreferredModeId(window));
assertEquals(0, mPolicy.getPreferredRefreshRate(window), FLOAT_TOLERANCE);
assertEquals(60, mPolicy.getPreferredMaxRefreshRate(window), FLOAT_TOLERANCE);
diff --git a/services/translation/java/com/android/server/translation/TranslationManagerServiceImpl.java b/services/translation/java/com/android/server/translation/TranslationManagerServiceImpl.java
index 16a2d8d..6606fb0 100644
--- a/services/translation/java/com/android/server/translation/TranslationManagerServiceImpl.java
+++ b/services/translation/java/com/android/server/translation/TranslationManagerServiceImpl.java
@@ -182,15 +182,28 @@
+ "translation state for token=" + token + " taskId=" + taskId);
return;
}
+ int translationActivityUid = -1;
try {
+ IBinder activityToken = taskTopActivityTokens.getActivityToken();
taskTopActivityTokens.getApplicationThread().updateUiTranslationState(
- taskTopActivityTokens.getActivityToken(), state, sourceSpec, targetSpec,
+ activityToken, state, sourceSpec, targetSpec,
viewIds, uiTranslationSpec);
mLastActivityTokens = new WeakReference<>(taskTopActivityTokens);
+ ComponentName componentName =
+ mActivityTaskManagerInternal.getActivityName(activityToken);
+ try {
+ if (componentName != null) {
+ translationActivityUid =
+ getContext().getPackageManager().getApplicationInfoAsUser(
+ componentName.getPackageName(), 0, getUserId()).uid;
+ }
+ } catch (PackageManager.NameNotFoundException e) {
+ Slog.d(TAG, "Cannot find package for" + componentName);
+ }
} catch (RemoteException e) {
Slog.w(TAG, "Update UiTranslationState fail: " + e);
}
- invokeCallbacks(state, sourceSpec, targetSpec);
+ invokeCallbacks(state, sourceSpec, targetSpec, translationActivityUid);
}
@GuardedBy("mLock")
@@ -216,7 +229,8 @@
}
private void invokeCallbacks(
- int state, TranslationSpec sourceSpec, TranslationSpec targetSpec) {
+ int state, TranslationSpec sourceSpec, TranslationSpec targetSpec,
+ int translationActivityUid) {
Bundle res = new Bundle();
res.putInt(EXTRA_STATE, state);
// TODO(177500482): Store the locale pair so it can be sent for RESUME events.
@@ -229,6 +243,14 @@
LocalServices.getService(InputMethodManagerInternal.class)
.getEnabledInputMethodListAsUser(mUserId);
mCallbacks.broadcast((callback, uid) -> {
+ // callback to the application that is translated if registered.
+ if ((int) uid == translationActivityUid) {
+ try {
+ callback.sendResult(res);
+ } catch (RemoteException e) {
+ Slog.w(TAG, "Failed to invoke UiTranslationStateCallback: " + e);
+ }
+ }
// Code here is non-optimal since it's temporary..
boolean isIme = false;
for (InputMethodInfo inputMethod : enabledInputMethods) {
diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/HotwordDetectionConnection.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/HotwordDetectionConnection.java
index beaca68..fc10fb1 100644
--- a/services/voiceinteraction/java/com/android/server/voiceinteraction/HotwordDetectionConnection.java
+++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/HotwordDetectionConnection.java
@@ -79,7 +79,7 @@
final class HotwordDetectionConnection {
private static final String TAG = "HotwordDetectionConnection";
// TODO (b/177502877): Set the Debug flag to false before shipping.
- private static final boolean DEBUG = true;
+ static final boolean DEBUG = true;
// TODO: These constants need to be refined.
private static final long VALIDATION_TIMEOUT_MILLIS = 3000;
diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/SoundTriggerSessionBinderProxy.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/SoundTriggerSessionBinderProxy.java
new file mode 100644
index 0000000..dd9fee3
--- /dev/null
+++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/SoundTriggerSessionBinderProxy.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.voiceinteraction;
+
+import android.hardware.soundtrigger.SoundTrigger;
+import android.os.RemoteException;
+
+import com.android.internal.app.IHotwordRecognitionStatusCallback;
+import com.android.internal.app.IVoiceInteractionSoundTriggerSession;
+
+/**
+ * A remote object that simply proxies calls to a real {@link IVoiceInteractionSoundTriggerSession}
+ * implementation. This design pattern allows us to add decorators to the core implementation
+ * (simply wrapping a binder object does not work).
+ */
+final class SoundTriggerSessionBinderProxy extends IVoiceInteractionSoundTriggerSession.Stub {
+
+ private final IVoiceInteractionSoundTriggerSession mDelegate;
+
+ SoundTriggerSessionBinderProxy(IVoiceInteractionSoundTriggerSession delegate) {
+ mDelegate = delegate;
+ }
+
+ @Override
+ public SoundTrigger.ModuleProperties getDspModuleProperties() throws RemoteException {
+ return mDelegate.getDspModuleProperties();
+ }
+
+ @Override
+ public int startRecognition(int i, String s,
+ IHotwordRecognitionStatusCallback iHotwordRecognitionStatusCallback,
+ SoundTrigger.RecognitionConfig recognitionConfig, boolean b) throws RemoteException {
+ return mDelegate.startRecognition(i, s, iHotwordRecognitionStatusCallback,
+ recognitionConfig, b);
+ }
+
+ @Override
+ public int stopRecognition(int i,
+ IHotwordRecognitionStatusCallback iHotwordRecognitionStatusCallback)
+ throws RemoteException {
+ return mDelegate.stopRecognition(i, iHotwordRecognitionStatusCallback);
+ }
+
+ @Override
+ public int setParameter(int i, int i1, int i2) throws RemoteException {
+ return mDelegate.setParameter(i, i1, i2);
+ }
+
+ @Override
+ public int getParameter(int i, int i1) throws RemoteException {
+ return mDelegate.getParameter(i, i1);
+ }
+
+ @Override
+ public SoundTrigger.ModelParamRange queryParameter(int i, int i1) throws RemoteException {
+ return mDelegate.queryParameter(i, i1);
+ }
+}
diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/SoundTriggerSessionPermissionsDecorator.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/SoundTriggerSessionPermissionsDecorator.java
new file mode 100644
index 0000000..bb7ca16
--- /dev/null
+++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/SoundTriggerSessionPermissionsDecorator.java
@@ -0,0 +1,158 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.voiceinteraction;
+
+import static android.Manifest.permission.CAPTURE_AUDIO_HOTWORD;
+import static android.Manifest.permission.RECORD_AUDIO;
+
+import static com.android.server.voiceinteraction.HotwordDetectionConnection.DEBUG;
+
+import android.annotation.NonNull;
+import android.content.Context;
+import android.content.PermissionChecker;
+import android.hardware.soundtrigger.SoundTrigger;
+import android.media.permission.Identity;
+import android.media.permission.PermissionUtil;
+import android.os.IBinder;
+import android.os.RemoteException;
+import android.os.ServiceSpecificException;
+import android.text.TextUtils;
+import android.util.Slog;
+
+import com.android.internal.app.IHotwordRecognitionStatusCallback;
+import com.android.internal.app.IVoiceInteractionSoundTriggerSession;
+
+/**
+ * Decorates {@link IVoiceInteractionSoundTriggerSession} with permission checks for {@link
+ * android.Manifest.permission#RECORD_AUDIO} and
+ * {@link android.Manifest.permission#CAPTURE_AUDIO_HOTWORD}.
+ * <p>
+ * Does not implement {@link #asBinder()} as it's intended to be wrapped by an
+ * {@link IVoiceInteractionSoundTriggerSession.Stub} object.
+ */
+final class SoundTriggerSessionPermissionsDecorator implements
+ IVoiceInteractionSoundTriggerSession {
+ static final String TAG = "SoundTriggerSessionPermissionsDecorator";
+
+ private final IVoiceInteractionSoundTriggerSession mDelegate;
+ private final Context mContext;
+ private final Identity mOriginatorIdentity;
+
+ SoundTriggerSessionPermissionsDecorator(IVoiceInteractionSoundTriggerSession delegate,
+ Context context, Identity originatorIdentity) {
+ mDelegate = delegate;
+ mContext = context;
+ mOriginatorIdentity = originatorIdentity;
+ }
+
+ @Override
+ public SoundTrigger.ModuleProperties getDspModuleProperties() throws RemoteException {
+ // No permission needed.
+ return mDelegate.getDspModuleProperties();
+ }
+
+ @Override
+ public int startRecognition(int i, String s,
+ IHotwordRecognitionStatusCallback iHotwordRecognitionStatusCallback,
+ SoundTrigger.RecognitionConfig recognitionConfig, boolean b) throws RemoteException {
+ if (DEBUG) {
+ Slog.d(TAG, "startRecognition");
+ }
+ enforcePermissions();
+ return mDelegate.startRecognition(i, s, iHotwordRecognitionStatusCallback,
+ recognitionConfig, b);
+ }
+
+ @Override
+ public int stopRecognition(int i,
+ IHotwordRecognitionStatusCallback iHotwordRecognitionStatusCallback)
+ throws RemoteException {
+ enforcePermissions();
+ return mDelegate.stopRecognition(i, iHotwordRecognitionStatusCallback);
+ }
+
+ @Override
+ public int setParameter(int i, int i1, int i2) throws RemoteException {
+ enforcePermissions();
+ return mDelegate.setParameter(i, i1, i2);
+ }
+
+ @Override
+ public int getParameter(int i, int i1) throws RemoteException {
+ enforcePermissions();
+ return mDelegate.getParameter(i, i1);
+ }
+
+ @Override
+ public SoundTrigger.ModelParamRange queryParameter(int i, int i1) throws RemoteException {
+ enforcePermissions();
+ return mDelegate.queryParameter(i, i1);
+ }
+
+ @Override
+ public IBinder asBinder() {
+ throw new UnsupportedOperationException(
+ "This object isn't intended to be used as a Binder.");
+ }
+
+ // TODO: Share this code with SoundTriggerMiddlewarePermission.
+ private void enforcePermissions() {
+ enforcePermissionForPreflight(mContext, mOriginatorIdentity, RECORD_AUDIO);
+ enforcePermissionForPreflight(mContext, mOriginatorIdentity, CAPTURE_AUDIO_HOTWORD);
+ }
+
+ /**
+ * Throws a {@link SecurityException} if originator permanently doesn't have the given
+ * permission, or a {@link ServiceSpecificException} with a {@link
+ * #TEMPORARY_PERMISSION_DENIED} if caller originator doesn't have the given permission.
+ *
+ * @param context A {@link Context}, used for permission checks.
+ * @param identity The identity to check.
+ * @param permission The identifier of the permission we want to check.
+ */
+ private static void enforcePermissionForPreflight(@NonNull Context context,
+ @NonNull Identity identity, @NonNull String permission) {
+ final int status = PermissionUtil.checkPermissionForPreflight(context, identity,
+ permission);
+ switch (status) {
+ case PermissionChecker.PERMISSION_GRANTED:
+ return;
+ case PermissionChecker.PERMISSION_HARD_DENIED:
+ throw new SecurityException(
+ TextUtils.formatSimple("Failed to obtain permission %s for identity %s",
+ permission, toString(identity)));
+ case PermissionChecker.PERMISSION_SOFT_DENIED:
+ throw new ServiceSpecificException(TEMPORARY_PERMISSION_DENIED,
+ TextUtils.formatSimple("Failed to obtain permission %s for identity %s",
+ permission, toString(identity)));
+ default:
+ throw new RuntimeException("Unexpected permission check result.");
+ }
+ }
+
+ private static String toString(Identity identity) {
+ return "{uid=" + identity.uid
+ + " pid=" + identity.pid
+ + " packageName=" + identity.packageName
+ + " attributionTag=" + identity.attributionTag
+ + "}";
+ }
+
+ // Temporary hack for using the same status code as SoundTrigger, so we don't change behavior.
+ // TODO: Reuse SoundTrigger code so we don't need to do this.
+ private static final int TEMPORARY_PERMISSION_DENIED = 3;
+}
diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java
index 162acba..91d17f7 100644
--- a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java
+++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java
@@ -23,6 +23,7 @@
import android.annotation.UserIdInt;
import android.app.ActivityManager;
import android.app.ActivityManagerInternal;
+import android.app.ActivityThread;
import android.app.AppGlobals;
import android.app.role.OnRoleHoldersChangedListener;
import android.app.role.RoleManager;
@@ -50,6 +51,7 @@
import android.hardware.soundtrigger.SoundTrigger.RecognitionConfig;
import android.media.AudioFormat;
import android.media.permission.Identity;
+import android.media.permission.IdentityContext;
import android.media.permission.PermissionUtil;
import android.media.permission.SafeCloseable;
import android.os.Binder;
@@ -59,6 +61,7 @@
import android.os.Parcel;
import android.os.ParcelFileDescriptor;
import android.os.PersistableBundle;
+import android.os.Process;
import android.os.RemoteCallback;
import android.os.RemoteCallbackList;
import android.os.RemoteException;
@@ -104,11 +107,8 @@
import java.io.FileDescriptor;
import java.io.PrintWriter;
-import java.lang.ref.WeakReference;
import java.util.ArrayList;
-import java.util.LinkedList;
import java.util.List;
-import java.util.ListIterator;
import java.util.Locale;
import java.util.Objects;
import java.util.concurrent.Executor;
@@ -288,7 +288,6 @@
private boolean mTemporarilyDisabled;
private final boolean mEnableService;
- private final List<WeakReference<SoundTriggerSession>> mSessions = new LinkedList<>();
VoiceInteractionManagerServiceStub() {
mEnableService = shouldEnableService(mContext);
@@ -299,15 +298,49 @@
public @NonNull IVoiceInteractionSoundTriggerSession createSoundTriggerSessionAsOriginator(
@NonNull Identity originatorIdentity, IBinder client) {
Objects.requireNonNull(originatorIdentity);
- try (SafeCloseable ignored = PermissionUtil.establishIdentityDirect(
- originatorIdentity)) {
- SoundTriggerSession session = new SoundTriggerSession(
- mSoundTriggerInternal.attach(client));
- synchronized (mSessions) {
- mSessions.add(new WeakReference<>(session));
- }
- return session;
+ boolean forHotwordDetectionService;
+ synchronized (VoiceInteractionManagerServiceStub.this) {
+ enforceIsCurrentVoiceInteractionService();
+ forHotwordDetectionService =
+ mImpl != null && mImpl.mHotwordDetectionConnection != null;
}
+ IVoiceInteractionSoundTriggerSession session;
+ if (forHotwordDetectionService) {
+ // Use our own identity and handle the permission checks ourselves. This allows
+ // properly checking/noting against the voice interactor or hotword detection
+ // service as needed.
+ if (HotwordDetectionConnection.DEBUG) {
+ Slog.d(TAG, "Creating a SoundTriggerSession for a HotwordDetectionService");
+ }
+ originatorIdentity.uid = Binder.getCallingUid();
+ originatorIdentity.pid = Binder.getCallingPid();
+ session = new SoundTriggerSessionPermissionsDecorator(
+ createSoundTriggerSessionForSelfIdentity(client),
+ mContext,
+ originatorIdentity);
+ } else {
+ if (HotwordDetectionConnection.DEBUG) {
+ Slog.d(TAG, "Creating a SoundTriggerSession");
+ }
+ try (SafeCloseable ignored = PermissionUtil.establishIdentityDirect(
+ originatorIdentity)) {
+ session = new SoundTriggerSession(mSoundTriggerInternal.attach(client));
+ }
+ }
+ return new SoundTriggerSessionBinderProxy(session);
+ }
+
+ private IVoiceInteractionSoundTriggerSession createSoundTriggerSessionForSelfIdentity(
+ IBinder client) {
+ Identity identity = new Identity();
+ identity.uid = Process.myUid();
+ identity.pid = Process.myPid();
+ identity.packageName = ActivityThread.currentOpPackageName();
+ return Binder.withCleanCallingIdentity(() -> {
+ try (SafeCloseable ignored = IdentityContext.create(identity)) {
+ return new SoundTriggerSession(mSoundTriggerInternal.attach(client));
+ }
+ });
}
// TODO: VI Make sure the caller is the current user or profile
@@ -1334,7 +1367,11 @@
return null;
}
- class SoundTriggerSession extends IVoiceInteractionSoundTriggerSession.Stub {
+ /**
+ * Implementation of SoundTriggerSession. Does not implement {@link #asBinder()} as it's
+ * intended to be wrapped by an {@link IVoiceInteractionSoundTriggerSession.Stub} object.
+ */
+ private class SoundTriggerSession implements IVoiceInteractionSoundTriggerSession {
final SoundTriggerInternal.Session mSession;
private IHotwordRecognitionStatusCallback mSessionExternalCallback;
private IRecognitionStatusCallback mSessionInternalCallback;
@@ -1481,6 +1518,12 @@
}
}
+ @Override
+ public IBinder asBinder() {
+ throw new UnsupportedOperationException(
+ "This object isn't intended to be used as a Binder.");
+ }
+
private int unloadKeyphraseModel(int keyphraseId) {
final long caller = Binder.clearCallingIdentity();
try {
@@ -1709,22 +1752,6 @@
}
mSoundTriggerInternal.dump(fd, pw, args);
-
- // Dump all sessions.
- synchronized (mSessions) {
- ListIterator<WeakReference<SoundTriggerSession>> iter =
- mSessions.listIterator();
- while (iter.hasNext()) {
- SoundTriggerSession session = iter.next().get();
- if (session != null) {
- session.dump(fd, args);
- } else {
- // Session is obsolete, now is a good chance to remove it from the list.
- iter.remove();
- }
- }
- }
-
}
@Override
diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java
index 7f1ea8f..e03e74c 100644
--- a/telephony/java/android/telephony/CarrierConfigManager.java
+++ b/telephony/java/android/telephony/CarrierConfigManager.java
@@ -4370,7 +4370,7 @@
new String[] {});
defaults.putBoolean(KEY_ENABLE_PRESENCE_CAPABILITY_EXCHANGE_BOOL, false);
defaults.putBoolean(KEY_RCS_BULK_CAPABILITY_EXCHANGE_BOOL, false);
- defaults.putBoolean(KEY_ENABLE_PRESENCE_GROUP_SUBSCRIBE_BOOL, true);
+ defaults.putBoolean(KEY_ENABLE_PRESENCE_GROUP_SUBSCRIBE_BOOL, false);
defaults.putInt(KEY_NON_RCS_CAPABILITIES_CACHE_EXPIRATION_SEC_INT, 30 * 24 * 60 * 60);
defaults.putBoolean(KEY_RCS_REQUEST_FORBIDDEN_BY_SIP_489_BOOL, false);
defaults.putLong(KEY_RCS_REQUEST_RETRY_INTERVAL_MILLIS_LONG, 20 * 60 * 1000);
diff --git a/telephony/java/android/telephony/NetworkRegistrationInfo.java b/telephony/java/android/telephony/NetworkRegistrationInfo.java
index 5fb60d7..6a80766 100644
--- a/telephony/java/android/telephony/NetworkRegistrationInfo.java
+++ b/telephony/java/android/telephony/NetworkRegistrationInfo.java
@@ -506,6 +506,8 @@
}
/**
+ * Require {@link android.Manifest.permission#ACCESS_FINE_LOCATION}, otherwise return null.
+ *
* @return The cell information.
*/
@Nullable
diff --git a/telephony/java/android/telephony/ServiceState.java b/telephony/java/android/telephony/ServiceState.java
index 6da61b7..d745dc2 100644
--- a/telephony/java/android/telephony/ServiceState.java
+++ b/telephony/java/android/telephony/ServiceState.java
@@ -758,6 +758,11 @@
* In GSM/UMTS, long format can be up to 16 characters long.
* In CDMA, returns the ERI text, if set. Otherwise, returns the ONS.
*
+ * Require at least {@link android.Manifest.permission#ACCESS_FINE_LOCATION} or
+ * {@link android.Manifest.permission#ACCESS_COARSE_LOCATION}. Otherwise return null if the
+ * caller does not hold neither {@link android.Manifest.permission#ACCESS_FINE_LOCATION} nor
+ * {@link android.Manifest.permission#ACCESS_COARSE_LOCATION}.
+ *
* @return long name of operator, null if unregistered or unknown
*/
public String getOperatorAlphaLong() {
@@ -766,6 +771,12 @@
/**
* Get current registered voice network operator name in long alphanumeric format.
+ *
+ * Require at least {@link android.Manifest.permission#ACCESS_FINE_LOCATION} or
+ * {@link android.Manifest.permission#ACCESS_COARSE_LOCATION}. Otherwise return null if the
+ * caller does not hold neither {@link android.Manifest.permission#ACCESS_FINE_LOCATION} nor
+ * {@link android.Manifest.permission#ACCESS_COARSE_LOCATION}.
+ *
* @return long name of operator
* @hide
*/
@@ -780,6 +791,11 @@
*
* In GSM/UMTS, short format can be up to 8 characters long.
*
+ * Require at least {@link android.Manifest.permission#ACCESS_FINE_LOCATION} or
+ * {@link android.Manifest.permission#ACCESS_COARSE_LOCATION}. Otherwise return null if the
+ * caller does not hold neither {@link android.Manifest.permission#ACCESS_FINE_LOCATION} nor
+ * {@link android.Manifest.permission#ACCESS_COARSE_LOCATION}.
+ *
* @return short name of operator, null if unregistered or unknown
*/
public String getOperatorAlphaShort() {
@@ -788,6 +804,12 @@
/**
* Get current registered voice network operator name in short alphanumeric format.
+ *
+ * Require at least {@link android.Manifest.permission#ACCESS_FINE_LOCATION} or
+ * {@link android.Manifest.permission#ACCESS_COARSE_LOCATION}. Otherwise return null if the
+ * caller does not have neither {@link android.Manifest.permission#ACCESS_FINE_LOCATION} nor
+ * {@link android.Manifest.permission#ACCESS_COARSE_LOCATION}.
+ *
* @return short name of operator, null if unregistered or unknown
* @hide
*/
@@ -799,6 +821,12 @@
/**
* Get current registered data network operator name in short alphanumeric format.
+ *
+ * Require at least {@link android.Manifest.permission#ACCESS_FINE_LOCATION} or
+ * {@link android.Manifest.permission#ACCESS_COARSE_LOCATION}. Otherwise return null if the
+ * caller does not have neither {@link android.Manifest.permission#ACCESS_FINE_LOCATION} nor
+ * {@link android.Manifest.permission#ACCESS_COARSE_LOCATION}.
+ *
* @return short name of operator, null if unregistered or unknown
* @hide
*/
@@ -812,6 +840,11 @@
* Get current registered operator name in long alphanumeric format if
* available or short otherwise.
*
+ * Require at least {@link android.Manifest.permission#ACCESS_FINE_LOCATION} or
+ * {@link android.Manifest.permission#ACCESS_COARSE_LOCATION}. Otherwise return null if the
+ * caller does not hold neither {@link android.Manifest.permission#ACCESS_FINE_LOCATION} nor
+ * {@link android.Manifest.permission#ACCESS_COARSE_LOCATION}.
+ *
* @see #getOperatorAlphaLong
* @see #getOperatorAlphaShort
*
@@ -832,6 +865,11 @@
* In GSM/UMTS, numeric format is 3 digit country code plus 2 or 3 digit
* network code.
*
+ * Require at least {@link android.Manifest.permission#ACCESS_FINE_LOCATION} or
+ * {@link android.Manifest.permission#ACCESS_COARSE_LOCATION}. Otherwise return null if the
+ * caller does not hold neither {@link android.Manifest.permission#ACCESS_FINE_LOCATION} nor
+ * {@link android.Manifest.permission#ACCESS_COARSE_LOCATION}.
+ *
* @return numeric format of operator, null if unregistered or unknown
*/
/*
@@ -844,6 +882,12 @@
/**
* Get current registered voice network operator numeric id.
+ *
+ * Require at least {@link android.Manifest.permission#ACCESS_FINE_LOCATION} or
+ * {@link android.Manifest.permission#ACCESS_COARSE_LOCATION}. Otherwise return null if the
+ * caller does not hold neither {@link android.Manifest.permission#ACCESS_FINE_LOCATION} nor
+ * {@link android.Manifest.permission#ACCESS_COARSE_LOCATION}.
+ *
* @return numeric format of operator, null if unregistered or unknown
* @hide
*/
@@ -854,6 +898,12 @@
/**
* Get current registered data network operator numeric id.
+ *
+ * Require at least {@link android.Manifest.permission#ACCESS_FINE_LOCATION} or
+ * {@link android.Manifest.permission#ACCESS_COARSE_LOCATION}. Otherwise return null if the
+ * caller does not hold neither {@link android.Manifest.permission#ACCESS_FINE_LOCATION} nor
+ * {@link android.Manifest.permission#ACCESS_COARSE_LOCATION}.
+ *
* @return numeric format of operator, null if unregistered or unknown
* @hide
*/
diff --git a/telephony/java/android/telephony/data/QosBearerFilter.java b/telephony/java/android/telephony/data/QosBearerFilter.java
index 5642549..54930d0 100644
--- a/telephony/java/android/telephony/data/QosBearerFilter.java
+++ b/telephony/java/android/telephony/data/QosBearerFilter.java
@@ -57,6 +57,12 @@
public static final int QOS_PROTOCOL_UDP = android.hardware.radio.V1_6.QosProtocol.UDP;
public static final int QOS_PROTOCOL_ESP = android.hardware.radio.V1_6.QosProtocol.ESP;
public static final int QOS_PROTOCOL_AH = android.hardware.radio.V1_6.QosProtocol.AH;
+ public static final int QOS_MIN_PORT = android.hardware.radio.V1_6.QosPortRange.MIN;
+ /**
+ * Hardcoded inplace of android.hardware.radio.V1_6.QosPortRange.MAX as it
+ * returns -1 due to uint16_t to int conversion in java. (TODO: Fix the HAL)
+ */
+ public static final int QOS_MAX_PORT = 65535; // android.hardware.radio.V1_6.QosPortRange.MIN;
@QosProtocol
private int protocol;
@@ -229,6 +235,12 @@
return end;
}
+ public boolean isValid() {
+ return start >= QOS_MIN_PORT && start <= QOS_MAX_PORT
+ && end >= QOS_MIN_PORT && end <= QOS_MAX_PORT
+ && start <= end;
+ }
+
@Override
public void writeToParcel(@NonNull Parcel dest, int flags) {
dest.writeInt(start);
diff --git a/telephony/java/android/telephony/ims/RcsContactUceCapability.java b/telephony/java/android/telephony/ims/RcsContactUceCapability.java
index 530003d..9112118 100644
--- a/telephony/java/android/telephony/ims/RcsContactUceCapability.java
+++ b/telephony/java/android/telephony/ims/RcsContactUceCapability.java
@@ -331,7 +331,7 @@
return null;
}
for (RcsContactPresenceTuple tuple : mPresenceTuples) {
- if (tuple.getServiceId().equals(serviceId)) {
+ if (tuple.getServiceId() != null && tuple.getServiceId().equals(serviceId)) {
return tuple;
}
}
diff --git a/tests/PlatformCompatGating/test-rules/src/android/compat/testing/PlatformCompatChangeRule.java b/tests/PlatformCompatGating/test-rules/src/android/compat/testing/PlatformCompatChangeRule.java
index 039ba51..0c5205c 100644
--- a/tests/PlatformCompatGating/test-rules/src/android/compat/testing/PlatformCompatChangeRule.java
+++ b/tests/PlatformCompatGating/test-rules/src/android/compat/testing/PlatformCompatChangeRule.java
@@ -118,7 +118,8 @@
Manifest.permission.LOG_COMPAT_CHANGE,
Manifest.permission.OVERRIDE_COMPAT_CHANGE_CONFIG,
Manifest.permission.OVERRIDE_COMPAT_CHANGE_CONFIG_ON_RELEASE_BUILD,
- Manifest.permission.READ_COMPAT_CHANGE_CONFIG);
+ Manifest.permission.READ_COMPAT_CHANGE_CONFIG,
+ Manifest.permission.INTERACT_ACROSS_USERS_FULL);
}
}
}