summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java10
-rw-r--r--api/system-current.txt26
-rw-r--r--core/java/com/android/internal/os/BatteryStatsImpl.java19
-rw-r--r--core/res/res/values-af/strings.xml4
-rw-r--r--core/res/res/values-am/strings.xml4
-rw-r--r--core/res/res/values-ar/strings.xml4
-rw-r--r--core/res/res/values-as/strings.xml4
-rw-r--r--core/res/res/values-az/strings.xml4
-rw-r--r--core/res/res/values-b+sr+Latn/strings.xml4
-rw-r--r--core/res/res/values-be/strings.xml4
-rw-r--r--core/res/res/values-bg/strings.xml4
-rw-r--r--core/res/res/values-bn/strings.xml4
-rw-r--r--core/res/res/values-bs/strings.xml4
-rw-r--r--core/res/res/values-ca/strings.xml4
-rw-r--r--core/res/res/values-cs/strings.xml4
-rw-r--r--core/res/res/values-da/strings.xml4
-rw-r--r--core/res/res/values-de/strings.xml4
-rw-r--r--core/res/res/values-el/strings.xml4
-rw-r--r--core/res/res/values-en-rAU/strings.xml4
-rw-r--r--core/res/res/values-en-rCA/strings.xml4
-rw-r--r--core/res/res/values-en-rGB/strings.xml4
-rw-r--r--core/res/res/values-en-rIN/strings.xml4
-rw-r--r--core/res/res/values-en-rXC/strings.xml4
-rw-r--r--core/res/res/values-es-rUS/strings.xml4
-rw-r--r--core/res/res/values-es/strings.xml4
-rw-r--r--core/res/res/values-et/strings.xml4
-rw-r--r--core/res/res/values-eu/strings.xml4
-rw-r--r--core/res/res/values-fa/strings.xml4
-rw-r--r--core/res/res/values-fi/strings.xml4
-rw-r--r--core/res/res/values-fr-rCA/strings.xml4
-rw-r--r--core/res/res/values-fr/strings.xml4
-rw-r--r--core/res/res/values-gl/strings.xml4
-rw-r--r--core/res/res/values-gu/strings.xml4
-rw-r--r--core/res/res/values-hi/strings.xml4
-rw-r--r--core/res/res/values-hr/strings.xml4
-rw-r--r--core/res/res/values-hu/strings.xml4
-rw-r--r--core/res/res/values-hy/strings.xml4
-rw-r--r--core/res/res/values-in/strings.xml4
-rw-r--r--core/res/res/values-is/strings.xml4
-rw-r--r--core/res/res/values-it/strings.xml4
-rw-r--r--core/res/res/values-iw/strings.xml4
-rw-r--r--core/res/res/values-ja/strings.xml4
-rw-r--r--core/res/res/values-ka/strings.xml4
-rw-r--r--core/res/res/values-kk/strings.xml4
-rw-r--r--core/res/res/values-km/strings.xml4
-rw-r--r--core/res/res/values-kn/strings.xml4
-rw-r--r--core/res/res/values-ko/strings.xml4
-rw-r--r--core/res/res/values-ky/strings.xml4
-rw-r--r--core/res/res/values-lo/strings.xml4
-rw-r--r--core/res/res/values-lt/strings.xml4
-rw-r--r--core/res/res/values-lv/strings.xml4
-rw-r--r--core/res/res/values-mk/strings.xml4
-rw-r--r--core/res/res/values-ml/strings.xml4
-rw-r--r--core/res/res/values-mn/strings.xml4
-rw-r--r--core/res/res/values-mr/strings.xml4
-rw-r--r--core/res/res/values-ms/strings.xml4
-rw-r--r--core/res/res/values-my/strings.xml4
-rw-r--r--core/res/res/values-nb/strings.xml4
-rw-r--r--core/res/res/values-ne/strings.xml4
-rw-r--r--core/res/res/values-nl/strings.xml4
-rw-r--r--core/res/res/values-or/strings.xml4
-rw-r--r--core/res/res/values-pa/strings.xml4
-rw-r--r--core/res/res/values-pl/strings.xml4
-rw-r--r--core/res/res/values-pt-rBR/strings.xml4
-rw-r--r--core/res/res/values-pt-rPT/strings.xml4
-rw-r--r--core/res/res/values-pt/strings.xml4
-rw-r--r--core/res/res/values-ro/strings.xml4
-rw-r--r--core/res/res/values-ru/strings.xml4
-rw-r--r--core/res/res/values-si/strings.xml4
-rw-r--r--core/res/res/values-sk/strings.xml4
-rw-r--r--core/res/res/values-sl/strings.xml4
-rw-r--r--core/res/res/values-sq/strings.xml4
-rw-r--r--core/res/res/values-sr/strings.xml4
-rw-r--r--core/res/res/values-sv/strings.xml4
-rw-r--r--core/res/res/values-sw/strings.xml4
-rw-r--r--core/res/res/values-ta/strings.xml4
-rw-r--r--core/res/res/values-te/strings.xml4
-rw-r--r--core/res/res/values-th/strings.xml4
-rw-r--r--core/res/res/values-tl/strings.xml4
-rw-r--r--core/res/res/values-tr/strings.xml4
-rw-r--r--core/res/res/values-uk/strings.xml4
-rw-r--r--core/res/res/values-ur/strings.xml4
-rw-r--r--core/res/res/values-uz/strings.xml4
-rw-r--r--core/res/res/values-vi/strings.xml4
-rw-r--r--core/res/res/values-zh-rCN/strings.xml4
-rw-r--r--core/res/res/values-zh-rHK/strings.xml4
-rw-r--r--core/res/res/values-zh-rTW/strings.xml4
-rw-r--r--core/res/res/values-zu/strings.xml4
-rw-r--r--core/res/res/values/strings.xml12
-rw-r--r--core/res/res/values/symbols.xml7
-rw-r--r--packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/AccessPointTest.java2
-rw-r--r--packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/WifiTrackerTest.java2
-rw-r--r--packages/SettingsProvider/src/android/provider/settings/validators/AccessibilityShortcutTargetListValidator.java46
-rw-r--r--packages/SettingsProvider/src/android/provider/settings/validators/ListValidator.java2
-rw-r--r--packages/SettingsProvider/src/android/provider/settings/validators/SecureSettingsValidators.java8
-rw-r--r--packages/SettingsProvider/src/android/provider/settings/validators/SettingsValidators.java3
-rw-r--r--packages/SettingsProvider/test/src/android/provider/settings/validators/SettingsValidatorsTest.java12
-rw-r--r--packages/Tethering/res/drawable-hdpi/stat_sys_tether_bluetooth.png (renamed from core/res/res/drawable-hdpi/stat_sys_tether_bluetooth.png)bin891 -> 891 bytes
-rw-r--r--packages/Tethering/res/drawable-hdpi/stat_sys_tether_general.png (renamed from core/res/res/drawable-hdpi/stat_sys_tether_general.png)bin963 -> 963 bytes
-rw-r--r--packages/Tethering/res/drawable-hdpi/stat_sys_tether_usb.png (renamed from core/res/res/drawable-hdpi/stat_sys_tether_usb.png)bin909 -> 909 bytes
-rw-r--r--packages/Tethering/res/drawable-ldpi/stat_sys_tether_bluetooth.png (renamed from core/res/res/drawable-ldpi/stat_sys_tether_bluetooth.png)bin534 -> 534 bytes
-rw-r--r--packages/Tethering/res/drawable-ldpi/stat_sys_tether_general.png (renamed from core/res/res/drawable-ldpi/stat_sys_tether_general.png)bin554 -> 554 bytes
-rw-r--r--packages/Tethering/res/drawable-ldpi/stat_sys_tether_usb.png (renamed from core/res/res/drawable-ldpi/stat_sys_tether_usb.png)bin518 -> 518 bytes
-rw-r--r--packages/Tethering/res/drawable-mdpi/stat_sys_tether_bluetooth.png (renamed from core/res/res/drawable-mdpi/stat_sys_tether_bluetooth.png)bin675 -> 675 bytes
-rw-r--r--packages/Tethering/res/drawable-mdpi/stat_sys_tether_general.png (renamed from core/res/res/drawable-mdpi/stat_sys_tether_general.png)bin659 -> 659 bytes
-rw-r--r--packages/Tethering/res/drawable-mdpi/stat_sys_tether_usb.png (renamed from core/res/res/drawable-mdpi/stat_sys_tether_usb.png)bin698 -> 698 bytes
-rw-r--r--packages/Tethering/res/drawable-xhdpi/stat_sys_tether_bluetooth.png (renamed from core/res/res/drawable-xhdpi/stat_sys_tether_bluetooth.png)bin1111 -> 1111 bytes
-rw-r--r--packages/Tethering/res/drawable-xhdpi/stat_sys_tether_general.png (renamed from core/res/res/drawable-xhdpi/stat_sys_tether_general.png)bin1274 -> 1274 bytes
-rw-r--r--packages/Tethering/res/drawable-xhdpi/stat_sys_tether_usb.png (renamed from core/res/res/drawable-xhdpi/stat_sys_tether_usb.png)bin1182 -> 1182 bytes
-rw-r--r--packages/Tethering/res/drawable-xxhdpi/stat_sys_tether_bluetooth.png (renamed from core/res/res/drawable-xxhdpi/stat_sys_tether_bluetooth.png)bin1046 -> 1046 bytes
-rw-r--r--packages/Tethering/res/drawable-xxhdpi/stat_sys_tether_general.png (renamed from core/res/res/drawable-xxhdpi/stat_sys_tether_general.png)bin1219 -> 1219 bytes
-rw-r--r--packages/Tethering/res/drawable-xxhdpi/stat_sys_tether_usb.png (renamed from core/res/res/drawable-xxhdpi/stat_sys_tether_usb.png)bin1002 -> 1002 bytes
-rw-r--r--packages/Tethering/res/values-af/strings.xml8
-rw-r--r--packages/Tethering/res/values-am/strings.xml8
-rw-r--r--packages/Tethering/res/values-ar/strings.xml8
-rw-r--r--packages/Tethering/res/values-as/strings.xml8
-rw-r--r--packages/Tethering/res/values-az/strings.xml8
-rw-r--r--packages/Tethering/res/values-b+sr+Latn/strings.xml8
-rw-r--r--packages/Tethering/res/values-be/strings.xml8
-rw-r--r--packages/Tethering/res/values-bg/strings.xml8
-rw-r--r--packages/Tethering/res/values-bn/strings.xml8
-rw-r--r--packages/Tethering/res/values-bs/strings.xml8
-rw-r--r--packages/Tethering/res/values-ca/strings.xml8
-rw-r--r--packages/Tethering/res/values-cs/strings.xml8
-rw-r--r--packages/Tethering/res/values-da/strings.xml8
-rw-r--r--packages/Tethering/res/values-de/strings.xml8
-rw-r--r--packages/Tethering/res/values-el/strings.xml8
-rw-r--r--packages/Tethering/res/values-en-rAU/strings.xml8
-rw-r--r--packages/Tethering/res/values-en-rCA/strings.xml8
-rw-r--r--packages/Tethering/res/values-en-rGB/strings.xml8
-rw-r--r--packages/Tethering/res/values-en-rIN/strings.xml8
-rw-r--r--packages/Tethering/res/values-en-rXC/strings.xml8
-rw-r--r--packages/Tethering/res/values-es-rUS/strings.xml8
-rw-r--r--packages/Tethering/res/values-es/strings.xml8
-rw-r--r--packages/Tethering/res/values-et/strings.xml8
-rw-r--r--packages/Tethering/res/values-eu/strings.xml8
-rw-r--r--packages/Tethering/res/values-fa/strings.xml8
-rw-r--r--packages/Tethering/res/values-fi/strings.xml8
-rw-r--r--packages/Tethering/res/values-fr-rCA/strings.xml8
-rw-r--r--packages/Tethering/res/values-fr/strings.xml8
-rw-r--r--packages/Tethering/res/values-gl/strings.xml8
-rw-r--r--packages/Tethering/res/values-gu/strings.xml8
-rw-r--r--packages/Tethering/res/values-hi/strings.xml8
-rw-r--r--packages/Tethering/res/values-hr/strings.xml8
-rw-r--r--packages/Tethering/res/values-hu/strings.xml8
-rw-r--r--packages/Tethering/res/values-hy/strings.xml8
-rw-r--r--packages/Tethering/res/values-in/strings.xml8
-rw-r--r--packages/Tethering/res/values-is/strings.xml8
-rw-r--r--packages/Tethering/res/values-it/strings.xml8
-rw-r--r--packages/Tethering/res/values-iw/strings.xml8
-rw-r--r--packages/Tethering/res/values-ja/strings.xml8
-rw-r--r--packages/Tethering/res/values-ka/strings.xml8
-rw-r--r--packages/Tethering/res/values-kk/strings.xml8
-rw-r--r--packages/Tethering/res/values-km/strings.xml8
-rw-r--r--packages/Tethering/res/values-kn/strings.xml8
-rw-r--r--packages/Tethering/res/values-ko/strings.xml8
-rw-r--r--packages/Tethering/res/values-ky/strings.xml8
-rw-r--r--packages/Tethering/res/values-lo/strings.xml8
-rw-r--r--packages/Tethering/res/values-lt/strings.xml8
-rw-r--r--packages/Tethering/res/values-lv/strings.xml8
-rw-r--r--packages/Tethering/res/values-mk/strings.xml8
-rw-r--r--packages/Tethering/res/values-ml/strings.xml8
-rw-r--r--packages/Tethering/res/values-mn/strings.xml8
-rw-r--r--packages/Tethering/res/values-mr/strings.xml8
-rw-r--r--packages/Tethering/res/values-ms/strings.xml8
-rw-r--r--packages/Tethering/res/values-my/strings.xml8
-rw-r--r--packages/Tethering/res/values-nb/strings.xml8
-rw-r--r--packages/Tethering/res/values-ne/strings.xml8
-rw-r--r--packages/Tethering/res/values-nl/strings.xml8
-rw-r--r--packages/Tethering/res/values-or/strings.xml8
-rw-r--r--packages/Tethering/res/values-pa/strings.xml8
-rw-r--r--packages/Tethering/res/values-pl/strings.xml8
-rw-r--r--packages/Tethering/res/values-pt-rBR/strings.xml8
-rw-r--r--packages/Tethering/res/values-pt-rPT/strings.xml8
-rw-r--r--packages/Tethering/res/values-pt/strings.xml8
-rw-r--r--packages/Tethering/res/values-ro/strings.xml8
-rw-r--r--packages/Tethering/res/values-ru/strings.xml8
-rw-r--r--packages/Tethering/res/values-si/strings.xml8
-rw-r--r--packages/Tethering/res/values-sk/strings.xml8
-rw-r--r--packages/Tethering/res/values-sl/strings.xml8
-rw-r--r--packages/Tethering/res/values-sq/strings.xml8
-rw-r--r--packages/Tethering/res/values-sr/strings.xml8
-rw-r--r--packages/Tethering/res/values-sv/strings.xml8
-rw-r--r--packages/Tethering/res/values-sw/strings.xml8
-rw-r--r--packages/Tethering/res/values-ta/strings.xml8
-rw-r--r--packages/Tethering/res/values-te/strings.xml8
-rw-r--r--packages/Tethering/res/values-th/strings.xml8
-rw-r--r--packages/Tethering/res/values-tl/strings.xml8
-rw-r--r--packages/Tethering/res/values-tr/strings.xml8
-rw-r--r--packages/Tethering/res/values-uk/strings.xml8
-rw-r--r--packages/Tethering/res/values-ur/strings.xml8
-rw-r--r--packages/Tethering/res/values-uz/strings.xml8
-rw-r--r--packages/Tethering/res/values-vi/strings.xml8
-rw-r--r--packages/Tethering/res/values-zh-rCN/strings.xml8
-rw-r--r--packages/Tethering/res/values-zh-rHK/strings.xml8
-rw-r--r--packages/Tethering/res/values-zh-rTW/strings.xml8
-rw-r--r--packages/Tethering/res/values-zu/strings.xml8
-rw-r--r--packages/Tethering/res/values/strings.xml16
-rw-r--r--packages/Tethering/src/com/android/server/connectivity/tethering/Tethering.java19
-rw-r--r--services/core/java/com/android/server/am/BatteryExternalStatsWorker.java73
-rwxr-xr-xservices/core/java/com/android/server/notification/NotificationManagerService.java20
-rw-r--r--services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java47
-rw-r--r--services/core/java/com/android/server/wm/ActivityDisplay.java49
-rw-r--r--services/core/java/com/android/server/wm/ActivityMetricsLogger.java8
-rw-r--r--services/core/java/com/android/server/wm/ActivityRecord.java163
-rw-r--r--services/core/java/com/android/server/wm/ActivityStack.java1265
-rw-r--r--services/core/java/com/android/server/wm/ActivityStackSupervisor.java61
-rw-r--r--services/core/java/com/android/server/wm/ActivityStarter.java8
-rw-r--r--services/core/java/com/android/server/wm/ActivityTaskManagerService.java52
-rw-r--r--services/core/java/com/android/server/wm/DisplayContent.java2
-rw-r--r--services/core/java/com/android/server/wm/KeyguardController.java3
-rw-r--r--services/core/java/com/android/server/wm/RecentsAnimation.java20
-rw-r--r--services/core/java/com/android/server/wm/RecentsAnimationController.java27
-rw-r--r--services/core/java/com/android/server/wm/ResetTargetTaskHelper.java9
-rw-r--r--services/core/java/com/android/server/wm/RootActivityContainer.java422
-rw-r--r--services/core/java/com/android/server/wm/Task.java692
-rw-r--r--services/core/java/com/android/server/wm/TaskPersister.java5
-rw-r--r--services/core/java/com/android/server/wm/TaskSnapshotCache.java4
-rw-r--r--services/core/java/com/android/server/wm/TaskSnapshotController.java21
-rw-r--r--services/core/java/com/android/server/wm/WindowContainer.java178
-rw-r--r--services/core/java/com/android/server/wm/WindowProcessController.java41
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java2
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/ActivityStackTests.java18
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/RootActivityContainerTests.java5
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/TaskRecordTests.java60
-rw-r--r--wifi/java/android/net/wifi/WifiActivityEnergyInfo.java260
-rw-r--r--wifi/java/android/net/wifi/hotspot2/OsuProvider.java42
-rw-r--r--wifi/tests/src/android/net/wifi/WifiManagerTest.java2
-rw-r--r--wifi/tests/src/android/net/wifi/hotspot2/OsuProviderTest.java13
229 files changed, 2597 insertions, 2179 deletions
diff --git a/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java b/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java
index 62c77ef20871..252f961563ff 100644
--- a/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java
+++ b/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java
@@ -1163,12 +1163,12 @@ public class StatsCompanionService extends IStatsCompanionService.Stub {
final WifiActivityEnergyInfo wifiInfo = awaitControllerInfo(wifiReceiver);
StatsLogEventWrapper e = new StatsLogEventWrapper(tagId, elapsedNanos,
wallClockNanos);
- e.writeLong(wifiInfo.getTimeStamp());
+ e.writeLong(wifiInfo.getTimeSinceBootMillis());
e.writeInt(wifiInfo.getStackState());
- e.writeLong(wifiInfo.getControllerTxTimeMillis());
- e.writeLong(wifiInfo.getControllerRxTimeMillis());
- e.writeLong(wifiInfo.getControllerIdleTimeMillis());
- e.writeLong(wifiInfo.getControllerEnergyUsed());
+ e.writeLong(wifiInfo.getControllerTxDurationMillis());
+ e.writeLong(wifiInfo.getControllerRxDurationMillis());
+ e.writeLong(wifiInfo.getControllerIdleDurationMillis());
+ e.writeLong(wifiInfo.getControllerEnergyUsedMicroJoules());
pulledData.add(e);
} catch (RemoteException e) {
Slog.e(TAG,
diff --git a/api/system-current.txt b/api/system-current.txt
index a72e24ba28b8..189585ea2d60 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -5319,6 +5319,32 @@ package android.net.wifi {
field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.SoftApInfo> CREATOR;
}
+ public final class WifiActivityEnergyInfo implements android.os.Parcelable {
+ ctor public WifiActivityEnergyInfo(long, int, long, long, long, long, long);
+ method public int describeContents();
+ method public long getControllerEnergyUsedMicroJoules();
+ method public long getControllerIdleDurationMillis();
+ method public long getControllerRxDurationMillis();
+ method public long getControllerScanDurationMillis();
+ method public long getControllerTxDurationMillis();
+ method public int getStackState();
+ method public long getTimeSinceBootMillis();
+ method public boolean isValid();
+ method public void setControllerEnergyUsedMicroJoules(long);
+ method public void setControllerIdleDurationMillis(long);
+ method public void setControllerRxDurationMillis(long);
+ method public void setControllerScanDurationMillis(long);
+ method public void setControllerTxDurationMillis(long);
+ method public void setStackState(int);
+ method public void setTimeSinceBootMillis(long);
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.WifiActivityEnergyInfo> CREATOR;
+ field public static final int STACK_STATE_INVALID = 0; // 0x0
+ field public static final int STACK_STATE_STATE_ACTIVE = 1; // 0x1
+ field public static final int STACK_STATE_STATE_IDLE = 3; // 0x3
+ field public static final int STACK_STATE_STATE_SCANNING = 2; // 0x2
+ }
+
public final class WifiClient implements android.os.Parcelable {
method public int describeContents();
method @NonNull public android.net.MacAddress getMacAddress();
diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java
index f1e299df0ee4..b350028a4d83 100644
--- a/core/java/com/android/internal/os/BatteryStatsImpl.java
+++ b/core/java/com/android/internal/os/BatteryStatsImpl.java
@@ -10801,10 +10801,10 @@ public class BatteryStatsImpl extends BatteryStats {
mHasWifiReporting = true;
// Measured in mAms
- final long txTimeMs = info.getControllerTxTimeMillis();
- final long rxTimeMs = info.getControllerRxTimeMillis();
- final long scanTimeMs = info.getControllerScanTimeMillis();
- final long idleTimeMs = info.getControllerIdleTimeMillis();
+ final long txTimeMs = info.getControllerTxDurationMillis();
+ final long rxTimeMs = info.getControllerRxDurationMillis();
+ final long scanTimeMs = info.getControllerScanDurationMillis();
+ final long idleTimeMs = info.getControllerIdleDurationMillis();
final long totalTimeMs = txTimeMs + rxTimeMs + idleTimeMs;
long leftOverRxTimeMs = rxTimeMs;
@@ -10947,13 +10947,14 @@ public class BatteryStatsImpl extends BatteryStats {
// Update WiFi controller stats.
- mWifiActivity.getRxTimeCounter().addCountLocked(info.getControllerRxTimeMillis());
+ mWifiActivity.getRxTimeCounter().addCountLocked(
+ info.getControllerRxDurationMillis());
mWifiActivity.getTxTimeCounters()[0].addCountLocked(
- info.getControllerTxTimeMillis());
+ info.getControllerTxDurationMillis());
mWifiActivity.getScanTimeCounter().addCountLocked(
- info.getControllerScanTimeMillis());
+ info.getControllerScanDurationMillis());
mWifiActivity.getIdleTimeCounter().addCountLocked(
- info.getControllerIdleTimeMillis());
+ info.getControllerIdleDurationMillis());
// POWER_WIFI_CONTROLLER_OPERATING_VOLTAGE is measured in mV, so convert to V.
final double opVolt = mPowerProfile.getAveragePower(
@@ -10961,7 +10962,7 @@ public class BatteryStatsImpl extends BatteryStats {
if (opVolt != 0) {
// We store the power drain as mAms.
mWifiActivity.getPowerCounter().addCountLocked(
- (long) (info.getControllerEnergyUsed() / opVolt));
+ (long) (info.getControllerEnergyUsedMicroJoules() / opVolt));
}
// Converting uWs to mAms.
// Conversion: (uWs * (1000ms / 1s) * (1mW / 1000uW)) / mV = mAms
diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml
index d095690588f5..4acdeeb29b46 100644
--- a/core/res/res/values-af/strings.xml
+++ b/core/res/res/values-af/strings.xml
@@ -1429,10 +1429,6 @@
<string name="submit" msgid="862795280643405865">"Dien in"</string>
<string name="car_mode_disable_notification_title" msgid="8450693275833142896">"Bestuurprogram werk tans"</string>
<string name="car_mode_disable_notification_message" msgid="8954550232288567515">"Tik om die bestuurprogram te verlaat."</string>
- <string name="tethered_notification_title" msgid="2700523927485687353">"Verbinding of Wi-Fi-warmkol aktief"</string>
- <string name="tethered_notification_message" msgid="6228080755828019453">"Tik om op te stel."</string>
- <string name="disable_tether_notification_title" msgid="7158047514545848391">"Verbinding is gedeaktiveer"</string>
- <string name="disable_tether_notification_message" msgid="98281313984014775">"Kontak jou administrateur vir besonderhede"</string>
<string name="back_button_label" msgid="4078224038025043387">"Terug"</string>
<string name="next_button_label" msgid="6040209156399907780">"Volgende"</string>
<string name="skip_button_label" msgid="3566599811326688389">"Slaan oor"</string>
diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml
index 75444ea595c2..c6e55c39ff95 100644
--- a/core/res/res/values-am/strings.xml
+++ b/core/res/res/values-am/strings.xml
@@ -1429,10 +1429,6 @@
<string name="submit" msgid="862795280643405865">"አስረክብ"</string>
<string name="car_mode_disable_notification_title" msgid="8450693275833142896">"የመንዳት መተግበሪያ እያሄደ ነው"</string>
<string name="car_mode_disable_notification_message" msgid="8954550232288567515">"ከመንዳት መተግበሪያ ለመውጣት መታ ያድርጉ።"</string>
- <string name="tethered_notification_title" msgid="2700523927485687353">"መሰካት ወይም ገባሪ ድረስ ነጥብ"</string>
- <string name="tethered_notification_message" msgid="6228080755828019453">"ለማዋቀር መታ ያድርጉ።"</string>
- <string name="disable_tether_notification_title" msgid="7158047514545848391">"እንደ ሞደም መሰካት ተሰናክሏል"</string>
- <string name="disable_tether_notification_message" msgid="98281313984014775">"ለዝርዝሮች የእርስዎን አስተዳዳሪ ያነጋግሩ"</string>
<string name="back_button_label" msgid="4078224038025043387">"ተመለስ"</string>
<string name="next_button_label" msgid="6040209156399907780">"ቀጥሎ"</string>
<string name="skip_button_label" msgid="3566599811326688389">"ዝለል"</string>
diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml
index 9928436b2a01..609b77e4f1db 100644
--- a/core/res/res/values-ar/strings.xml
+++ b/core/res/res/values-ar/strings.xml
@@ -1509,10 +1509,6 @@
<string name="submit" msgid="862795280643405865">"إرسال"</string>
<string name="car_mode_disable_notification_title" msgid="8450693275833142896">"تطبيق القيادة قيد التشغيل"</string>
<string name="car_mode_disable_notification_message" msgid="8954550232288567515">"انقر للخروج من تطبيق القيادة."</string>
- <string name="tethered_notification_title" msgid="2700523927485687353">"النطاق أو نقطة الاتصال نشطة"</string>
- <string name="tethered_notification_message" msgid="6228080755828019453">"انقر للإعداد."</string>
- <string name="disable_tether_notification_title" msgid="7158047514545848391">"تم إيقاف التوصيل"</string>
- <string name="disable_tether_notification_message" msgid="98281313984014775">"اتصل بالمشرف للحصول على التفاصيل"</string>
<string name="back_button_label" msgid="4078224038025043387">"رجوع"</string>
<string name="next_button_label" msgid="6040209156399907780">"التالي"</string>
<string name="skip_button_label" msgid="3566599811326688389">"التخطي"</string>
diff --git a/core/res/res/values-as/strings.xml b/core/res/res/values-as/strings.xml
index cfd62394fd79..091b563ff2e9 100644
--- a/core/res/res/values-as/strings.xml
+++ b/core/res/res/values-as/strings.xml
@@ -1429,10 +1429,6 @@
<string name="submit" msgid="862795280643405865">"দাখিল কৰক"</string>
<string name="car_mode_disable_notification_title" msgid="8450693275833142896">"ড্ৰাইভিং এপ্ চলি আছে"</string>
<string name="car_mode_disable_notification_message" msgid="8954550232288567515">"ড্ৰাইভিং এপৰ পৰা বাহিৰ হ\'বলৈ টিপক।"</string>
- <string name="tethered_notification_title" msgid="2700523927485687353">"টেডাৰিং বা হটস্প\'ট সক্ৰিয় অৱস্থাত আছে"</string>
- <string name="tethered_notification_message" msgid="6228080755828019453">"ছেট আপ কৰিবলৈ টিপক।"</string>
- <string name="disable_tether_notification_title" msgid="7158047514545848391">"টেডাৰিং অক্ষম কৰি থোৱা হৈছে"</string>
- <string name="disable_tether_notification_message" msgid="98281313984014775">"সবিশেষ জানিবলৈ আপোনাৰ প্ৰশাসকৰ সৈতে যোগাযোগ কৰক"</string>
<string name="back_button_label" msgid="4078224038025043387">"উভতি যাওক"</string>
<string name="next_button_label" msgid="6040209156399907780">"পৰৱৰ্তী"</string>
<string name="skip_button_label" msgid="3566599811326688389">"এৰি যাওক"</string>
diff --git a/core/res/res/values-az/strings.xml b/core/res/res/values-az/strings.xml
index a26d49d79d28..359dfb757014 100644
--- a/core/res/res/values-az/strings.xml
+++ b/core/res/res/values-az/strings.xml
@@ -1429,10 +1429,6 @@
<string name="submit" msgid="862795280643405865">"Göndər"</string>
<string name="car_mode_disable_notification_title" msgid="8450693275833142896">"Sürücülük tətbiqi işləyir"</string>
<string name="car_mode_disable_notification_message" msgid="8954550232288567515">"Sürücülük tətbiqindən çıxmaq üçün klikləyin."</string>
- <string name="tethered_notification_title" msgid="2700523927485687353">"Tezerinq və ya hotspot aktivdir"</string>
- <string name="tethered_notification_message" msgid="6228080755828019453">"Quraşdırmaq üçün tıklayın."</string>
- <string name="disable_tether_notification_title" msgid="7158047514545848391">"Birləşmə deaktivdir"</string>
- <string name="disable_tether_notification_message" msgid="98281313984014775">"Məlumat üçün adminlə əlaqə saxlayın"</string>
<string name="back_button_label" msgid="4078224038025043387">"Geri"</string>
<string name="next_button_label" msgid="6040209156399907780">"Növbəti"</string>
<string name="skip_button_label" msgid="3566599811326688389">"Keç"</string>
diff --git a/core/res/res/values-b+sr+Latn/strings.xml b/core/res/res/values-b+sr+Latn/strings.xml
index 6d0ae6bab591..a27d3590dbd1 100644
--- a/core/res/res/values-b+sr+Latn/strings.xml
+++ b/core/res/res/values-b+sr+Latn/strings.xml
@@ -1449,10 +1449,6 @@
<string name="submit" msgid="862795280643405865">"Pošalji"</string>
<string name="car_mode_disable_notification_title" msgid="8450693275833142896">"Aplikacija za vožnju je pokrenuta"</string>
<string name="car_mode_disable_notification_message" msgid="8954550232288567515">"Dodirnite da biste izašli iz aplikacije za vožnju."</string>
- <string name="tethered_notification_title" msgid="2700523927485687353">"Aktivno povezivanje sa internetom preko mobilnog uređaja ili hotspot"</string>
- <string name="tethered_notification_message" msgid="6228080755828019453">"Dodirnite da biste podesili."</string>
- <string name="disable_tether_notification_title" msgid="7158047514545848391">"Privezivanje je onemogućeno"</string>
- <string name="disable_tether_notification_message" msgid="98281313984014775">"Potražite detalje od administratora"</string>
<string name="back_button_label" msgid="4078224038025043387">"Nazad"</string>
<string name="next_button_label" msgid="6040209156399907780">"Next"</string>
<string name="skip_button_label" msgid="3566599811326688389">"Preskoči"</string>
diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml
index 390e8b190d92..fb0fa33259f5 100644
--- a/core/res/res/values-be/strings.xml
+++ b/core/res/res/values-be/strings.xml
@@ -1469,10 +1469,6 @@
<string name="submit" msgid="862795280643405865">"Перадаць"</string>
<string name="car_mode_disable_notification_title" msgid="8450693275833142896">"Праграма для ваджэння ўключана"</string>
<string name="car_mode_disable_notification_message" msgid="8954550232288567515">"Націсніце, каб выйсці з праграмы для ваджэння."</string>
- <string name="tethered_notification_title" msgid="2700523927485687353">"USB-мадэм або хот-спот Wi-Fi актыўныя"</string>
- <string name="tethered_notification_message" msgid="6228080755828019453">"Дакраніцеся, каб наладзіць."</string>
- <string name="disable_tether_notification_title" msgid="7158047514545848391">"Рэжым мадэма адключаны"</string>
- <string name="disable_tether_notification_message" msgid="98281313984014775">"Звярніцеся да адміністратара па падрабязную інфармацыю"</string>
<string name="back_button_label" msgid="4078224038025043387">"Назад"</string>
<string name="next_button_label" msgid="6040209156399907780">"Далей"</string>
<string name="skip_button_label" msgid="3566599811326688389">"Прапусціць"</string>
diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml
index d47229df5d40..69c998d2afd0 100644
--- a/core/res/res/values-bg/strings.xml
+++ b/core/res/res/values-bg/strings.xml
@@ -1429,10 +1429,6 @@
<string name="submit" msgid="862795280643405865">"Изпращане"</string>
<string name="car_mode_disable_notification_title" msgid="8450693275833142896">"Приложението за шофиране е включено"</string>
<string name="car_mode_disable_notification_message" msgid="8954550232288567515">"Докоснете, за да излезете от приложението за шофиране."</string>
- <string name="tethered_notification_title" msgid="2700523927485687353">"Има активна споделена връзка или безжична точка за достъп"</string>
- <string name="tethered_notification_message" msgid="6228080755828019453">"Докоснете, за да настроите."</string>
- <string name="disable_tether_notification_title" msgid="7158047514545848391">"Функцията за тетъринг е деактивирана"</string>
- <string name="disable_tether_notification_message" msgid="98281313984014775">"Свържете се с администратора си за подробности"</string>
<string name="back_button_label" msgid="4078224038025043387">"Назад"</string>
<string name="next_button_label" msgid="6040209156399907780">"Напред"</string>
<string name="skip_button_label" msgid="3566599811326688389">"Пропускане"</string>
diff --git a/core/res/res/values-bn/strings.xml b/core/res/res/values-bn/strings.xml
index a767a71265da..e3353962aa8c 100644
--- a/core/res/res/values-bn/strings.xml
+++ b/core/res/res/values-bn/strings.xml
@@ -1429,10 +1429,6 @@
<string name="submit" msgid="862795280643405865">"জমা দিন"</string>
<string name="car_mode_disable_notification_title" msgid="8450693275833142896">"ড্রাইভিং অ্যাপ চালু আছে"</string>
<string name="car_mode_disable_notification_message" msgid="8954550232288567515">"ড্রাইভিং অ্যাপ বন্ধ করতে ট্যাপ করুন।"</string>
- <string name="tethered_notification_title" msgid="2700523927485687353">"টিথারিং বা হটস্পট সক্রিয় আছে"</string>
- <string name="tethered_notification_message" msgid="6228080755828019453">"সেট-আপ করার জন্য আলতো চাপুন৷"</string>
- <string name="disable_tether_notification_title" msgid="7158047514545848391">"টিথারিং অক্ষম করা আছে"</string>
- <string name="disable_tether_notification_message" msgid="98281313984014775">"বিশদ বিবরণের জন্য প্রশাসকের সাথে যোগাযোগ করুন"</string>
<string name="back_button_label" msgid="4078224038025043387">"ফিরুন"</string>
<string name="next_button_label" msgid="6040209156399907780">"পরবর্তী"</string>
<string name="skip_button_label" msgid="3566599811326688389">"এড়িয়ে যান"</string>
diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml
index f1c15001e6ae..d7bd7a17add9 100644
--- a/core/res/res/values-bs/strings.xml
+++ b/core/res/res/values-bs/strings.xml
@@ -1451,10 +1451,6 @@
<string name="submit" msgid="862795280643405865">"Potvrdi"</string>
<string name="car_mode_disable_notification_title" msgid="8450693275833142896">"Aplikacija za vožnju je pokrenuta"</string>
<string name="car_mode_disable_notification_message" msgid="8954550232288567515">"Dodirnite za izlaz iz aplikacije za vožnju."</string>
- <string name="tethered_notification_title" msgid="2700523927485687353">"Uređaj dijeli vezu ili djeluje kao pristupna tačka"</string>
- <string name="tethered_notification_message" msgid="6228080755828019453">"Dodirnite za postavke"</string>
- <string name="disable_tether_notification_title" msgid="7158047514545848391">"Povezivanje putem mobitela je onemogućeno"</string>
- <string name="disable_tether_notification_message" msgid="98281313984014775">"Kontaktirajte svog administratora za dodatne detalje"</string>
<string name="back_button_label" msgid="4078224038025043387">"Nazad"</string>
<string name="next_button_label" msgid="6040209156399907780">"Naprijed"</string>
<string name="skip_button_label" msgid="3566599811326688389">"Preskoči"</string>
diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml
index 4b1940518584..1f7d82e05961 100644
--- a/core/res/res/values-ca/strings.xml
+++ b/core/res/res/values-ca/strings.xml
@@ -1429,10 +1429,6 @@
<string name="submit" msgid="862795280643405865">"Envia"</string>
<string name="car_mode_disable_notification_title" msgid="8450693275833142896">"S\'està executant l\'aplicació de conducció"</string>
<string name="car_mode_disable_notification_message" msgid="8954550232288567515">"Toca per sortir de l\'aplicació de conducció."</string>
- <string name="tethered_notification_title" msgid="2700523927485687353">"Compartició de xarxa o punt d\'accés Wi-Fi activat"</string>
- <string name="tethered_notification_message" msgid="6228080755828019453">"Toca per configurar."</string>
- <string name="disable_tether_notification_title" msgid="7158047514545848391">"La compartició de xarxa està desactivada"</string>
- <string name="disable_tether_notification_message" msgid="98281313984014775">"Contacta amb el teu administrador per obtenir més informació"</string>
<string name="back_button_label" msgid="4078224038025043387">"Enrere"</string>
<string name="next_button_label" msgid="6040209156399907780">"Següent"</string>
<string name="skip_button_label" msgid="3566599811326688389">"Omet"</string>
diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml
index 22fd4c6464ef..e05f29945ee6 100644
--- a/core/res/res/values-cs/strings.xml
+++ b/core/res/res/values-cs/strings.xml
@@ -1469,10 +1469,6 @@
<string name="submit" msgid="862795280643405865">"Odeslat"</string>
<string name="car_mode_disable_notification_title" msgid="8450693275833142896">"Jízdní aplikace je spuštěna"</string>
<string name="car_mode_disable_notification_message" msgid="8954550232288567515">"Jízdní aplikaci zavřete klepnutím."</string>
- <string name="tethered_notification_title" msgid="2700523927485687353">"Sdílené připojení nebo hotspot je aktivní."</string>
- <string name="tethered_notification_message" msgid="6228080755828019453">"Klepnutím zahájíte nastavení."</string>
- <string name="disable_tether_notification_title" msgid="7158047514545848391">"Tethering je zakázán"</string>
- <string name="disable_tether_notification_message" msgid="98281313984014775">"O podrobnosti požádejte administrátora"</string>
<string name="back_button_label" msgid="4078224038025043387">"Zpět"</string>
<string name="next_button_label" msgid="6040209156399907780">"Další"</string>
<string name="skip_button_label" msgid="3566599811326688389">"Přeskočit"</string>
diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml
index 4475a1bd3e13..772b7b054070 100644
--- a/core/res/res/values-da/strings.xml
+++ b/core/res/res/values-da/strings.xml
@@ -1429,10 +1429,6 @@
<string name="submit" msgid="862795280643405865">"Send"</string>
<string name="car_mode_disable_notification_title" msgid="8450693275833142896">"Bilkørselsappen er aktiv"</string>
<string name="car_mode_disable_notification_message" msgid="8954550232288567515">"Tryk for at lukke bilkørselsappen."</string>
- <string name="tethered_notification_title" msgid="2700523927485687353">"Netdeling eller hotspot er aktivt"</string>
- <string name="tethered_notification_message" msgid="6228080755828019453">"Tryk for at konfigurere"</string>
- <string name="disable_tether_notification_title" msgid="7158047514545848391">"Netdeling er deaktiveret"</string>
- <string name="disable_tether_notification_message" msgid="98281313984014775">"Kontakt din administrator for at få oplysninger"</string>
<string name="back_button_label" msgid="4078224038025043387">"Tilbage"</string>
<string name="next_button_label" msgid="6040209156399907780">"Næste"</string>
<string name="skip_button_label" msgid="3566599811326688389">"Spring over"</string>
diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml
index 2489fca648a9..bb29a0e2d607 100644
--- a/core/res/res/values-de/strings.xml
+++ b/core/res/res/values-de/strings.xml
@@ -1429,10 +1429,6 @@
<string name="submit" msgid="862795280643405865">"Senden"</string>
<string name="car_mode_disable_notification_title" msgid="8450693275833142896">"Fahr-App wird ausgeführt"</string>
<string name="car_mode_disable_notification_message" msgid="8954550232288567515">"Tippen, um die Fahr-App zu beenden."</string>
- <string name="tethered_notification_title" msgid="2700523927485687353">"Tethering oder Hotspot aktiv"</string>
- <string name="tethered_notification_message" msgid="6228080755828019453">"Zum Einrichten tippen."</string>
- <string name="disable_tether_notification_title" msgid="7158047514545848391">"Tethering ist deaktiviert"</string>
- <string name="disable_tether_notification_message" msgid="98281313984014775">"Bitte wende dich für weitere Informationen an den Administrator"</string>
<string name="back_button_label" msgid="4078224038025043387">"Zurück"</string>
<string name="next_button_label" msgid="6040209156399907780">"Weiter"</string>
<string name="skip_button_label" msgid="3566599811326688389">"Überspringen"</string>
diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml
index 6c76a1f3d2ef..807c4c279903 100644
--- a/core/res/res/values-el/strings.xml
+++ b/core/res/res/values-el/strings.xml
@@ -1429,10 +1429,6 @@
<string name="submit" msgid="862795280643405865">"Υποβολή"</string>
<string name="car_mode_disable_notification_title" msgid="8450693275833142896">"Η εφαρμογή οδήγησης εκτελείται"</string>
<string name="car_mode_disable_notification_message" msgid="8954550232288567515">"Πατήστε για να εξέλθετε από την εφαρμογή οδήγησης."</string>
- <string name="tethered_notification_title" msgid="2700523927485687353">"Πρόσδεση ή σύνδεση σημείου πρόσβασης ενεργή"</string>
- <string name="tethered_notification_message" msgid="6228080755828019453">"Πατήστε για ρύθμιση."</string>
- <string name="disable_tether_notification_title" msgid="7158047514545848391">"Η σύνδεση είναι απενεργοποιημένη"</string>
- <string name="disable_tether_notification_message" msgid="98281313984014775">"Επικοινωνήστε με τον διαχειριστή σας για λεπτομέρειες"</string>
<string name="back_button_label" msgid="4078224038025043387">"Πίσω"</string>
<string name="next_button_label" msgid="6040209156399907780">"Επόμενο"</string>
<string name="skip_button_label" msgid="3566599811326688389">"Παράλειψη"</string>
diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml
index e5f610b4629c..8d2f80541c59 100644
--- a/core/res/res/values-en-rAU/strings.xml
+++ b/core/res/res/values-en-rAU/strings.xml
@@ -1429,10 +1429,6 @@
<string name="submit" msgid="862795280643405865">"Submit"</string>
<string name="car_mode_disable_notification_title" msgid="8450693275833142896">"Driving app is running"</string>
<string name="car_mode_disable_notification_message" msgid="8954550232288567515">"Tap to exit driving app."</string>
- <string name="tethered_notification_title" msgid="2700523927485687353">"Tethering or hotspot active"</string>
- <string name="tethered_notification_message" msgid="6228080755828019453">"Tap to set up."</string>
- <string name="disable_tether_notification_title" msgid="7158047514545848391">"Tethering is disabled"</string>
- <string name="disable_tether_notification_message" msgid="98281313984014775">"Contact your admin for details"</string>
<string name="back_button_label" msgid="4078224038025043387">"Back"</string>
<string name="next_button_label" msgid="6040209156399907780">"Next"</string>
<string name="skip_button_label" msgid="3566599811326688389">"Skip"</string>
diff --git a/core/res/res/values-en-rCA/strings.xml b/core/res/res/values-en-rCA/strings.xml
index 2cff16f93942..e53858750de9 100644
--- a/core/res/res/values-en-rCA/strings.xml
+++ b/core/res/res/values-en-rCA/strings.xml
@@ -1429,10 +1429,6 @@
<string name="submit" msgid="862795280643405865">"Submit"</string>
<string name="car_mode_disable_notification_title" msgid="8450693275833142896">"Driving app is running"</string>
<string name="car_mode_disable_notification_message" msgid="8954550232288567515">"Tap to exit driving app."</string>
- <string name="tethered_notification_title" msgid="2700523927485687353">"Tethering or hotspot active"</string>
- <string name="tethered_notification_message" msgid="6228080755828019453">"Tap to set up."</string>
- <string name="disable_tether_notification_title" msgid="7158047514545848391">"Tethering is disabled"</string>
- <string name="disable_tether_notification_message" msgid="98281313984014775">"Contact your admin for details"</string>
<string name="back_button_label" msgid="4078224038025043387">"Back"</string>
<string name="next_button_label" msgid="6040209156399907780">"Next"</string>
<string name="skip_button_label" msgid="3566599811326688389">"Skip"</string>
diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml
index e5f610b4629c..8d2f80541c59 100644
--- a/core/res/res/values-en-rGB/strings.xml
+++ b/core/res/res/values-en-rGB/strings.xml
@@ -1429,10 +1429,6 @@
<string name="submit" msgid="862795280643405865">"Submit"</string>
<string name="car_mode_disable_notification_title" msgid="8450693275833142896">"Driving app is running"</string>
<string name="car_mode_disable_notification_message" msgid="8954550232288567515">"Tap to exit driving app."</string>
- <string name="tethered_notification_title" msgid="2700523927485687353">"Tethering or hotspot active"</string>
- <string name="tethered_notification_message" msgid="6228080755828019453">"Tap to set up."</string>
- <string name="disable_tether_notification_title" msgid="7158047514545848391">"Tethering is disabled"</string>
- <string name="disable_tether_notification_message" msgid="98281313984014775">"Contact your admin for details"</string>
<string name="back_button_label" msgid="4078224038025043387">"Back"</string>
<string name="next_button_label" msgid="6040209156399907780">"Next"</string>
<string name="skip_button_label" msgid="3566599811326688389">"Skip"</string>
diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml
index e5f610b4629c..8d2f80541c59 100644
--- a/core/res/res/values-en-rIN/strings.xml
+++ b/core/res/res/values-en-rIN/strings.xml
@@ -1429,10 +1429,6 @@
<string name="submit" msgid="862795280643405865">"Submit"</string>
<string name="car_mode_disable_notification_title" msgid="8450693275833142896">"Driving app is running"</string>
<string name="car_mode_disable_notification_message" msgid="8954550232288567515">"Tap to exit driving app."</string>
- <string name="tethered_notification_title" msgid="2700523927485687353">"Tethering or hotspot active"</string>
- <string name="tethered_notification_message" msgid="6228080755828019453">"Tap to set up."</string>
- <string name="disable_tether_notification_title" msgid="7158047514545848391">"Tethering is disabled"</string>
- <string name="disable_tether_notification_message" msgid="98281313984014775">"Contact your admin for details"</string>
<string name="back_button_label" msgid="4078224038025043387">"Back"</string>
<string name="next_button_label" msgid="6040209156399907780">"Next"</string>
<string name="skip_button_label" msgid="3566599811326688389">"Skip"</string>
diff --git a/core/res/res/values-en-rXC/strings.xml b/core/res/res/values-en-rXC/strings.xml
index 6d536e43a26c..1436692bd319 100644
--- a/core/res/res/values-en-rXC/strings.xml
+++ b/core/res/res/values-en-rXC/strings.xml
@@ -1429,10 +1429,6 @@
<string name="submit" msgid="862795280643405865">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‏‏‏‏‏‏‏‎‎‏‎‏‎‎‎‎‏‏‏‎‏‏‏‏‎‎‏‎‎‎‏‎‎‎‏‎‏‎‎‎‏‎‎‎‏‏‏‎‎‎‎‎‏‎‏‎‎‏‎Submit‎‏‎‎‏‎"</string>
<string name="car_mode_disable_notification_title" msgid="8450693275833142896">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‏‎‏‎‎‎‏‏‎‏‏‏‎‎‏‎‎‏‏‎‎‎‎‏‎‏‎‏‏‏‎‏‏‏‏‎‏‎‎‎‏‎‎‎‎‏‏‏‎‎‏‏‏‎‎‎‎‎Driving app is running‎‏‎‎‏‎"</string>
<string name="car_mode_disable_notification_message" msgid="8954550232288567515">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‎‎‎‏‎‎‎‏‎‎‏‏‏‏‎‎‏‏‏‏‏‏‏‏‏‎‎‎‏‏‎‏‏‎‏‏‏‏‎‎‏‏‏‎‏‎‎‎‎‎‏‏‎‏‏‎‏‏‎Tap to exit driving app.‎‏‎‎‏‎"</string>
- <string name="tethered_notification_title" msgid="2700523927485687353">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‎‏‎‏‏‏‏‎‏‎‎‎‏‏‎‎‎‎‎‎‏‏‎‏‎‎‎‎‏‏‏‏‎‏‎‎‏‏‏‎‏‎‎‎‏‎‎‏‏‎‎‎‏‏‏‎‎‏‎Tethering or hotspot active‎‏‎‎‏‎"</string>
- <string name="tethered_notification_message" msgid="6228080755828019453">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‏‎‎‏‏‎‏‏‏‎‏‎‎‏‎‏‏‎‎‏‏‏‎‎‏‏‎‎‎‏‏‎‏‏‏‎‎‏‎‎‏‏‎‏‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎Tap to set up.‎‏‎‎‏‎"</string>
- <string name="disable_tether_notification_title" msgid="7158047514545848391">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‏‏‎‏‎‏‎‏‏‎‎‏‏‏‏‏‏‎‎‏‎‎‏‎‏‎‎‎‎‏‏‏‎‏‏‏‎‏‏‏‏‏‏‎‎‎‎‎‎‎‎‏‎‎‎‏‏‏‎Tethering is disabled‎‏‎‎‏‎"</string>
- <string name="disable_tether_notification_message" msgid="98281313984014775">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‎‏‏‎‏‎‏‏‏‎‏‎‎‏‎‏‎‏‎‎‏‎‏‎‏‎‏‏‎‎‏‏‎‎‎‎‎‎‏‎‎‏‏‎‏‏‎‏‎‎‏‏‎‏‏‎‏‏‏‎Contact your admin for details‎‏‎‎‏‎"</string>
<string name="back_button_label" msgid="4078224038025043387">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‎‎‏‎‎‏‏‎‎‎‏‏‎‎‎‎‏‏‎‎‏‎‎‏‏‏‏‎‏‏‏‏‎‎‏‏‏‏‎‎‎‏‎‎‎‏‏‏‎‏‏‎‏‏‏‎‏‏‎Back‎‏‎‎‏‎"</string>
<string name="next_button_label" msgid="6040209156399907780">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‏‏‏‏‎‏‎‎‏‏‎‎‏‎‎‎‏‎‎‎‏‏‏‎‎‏‏‎‏‏‎‎‎‎‎‏‎‎‎‏‏‏‎‏‎‎‎‎‏‏‏‏‎‎‎‏‎‎‎Next‎‏‎‎‏‎"</string>
<string name="skip_button_label" msgid="3566599811326688389">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‎‏‎‏‏‏‏‏‏‏‎‎‎‏‏‎‏‏‏‎‏‎‎‎‎‏‏‎‏‏‏‎‏‎‎‎‎‏‏‎‏‎‎‎‏‏‏‏‎‎‏‎‎‎‎‏‎‏‎Skip‎‏‎‎‏‎"</string>
diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml
index 3b9c7ad74957..b04882ac3902 100644
--- a/core/res/res/values-es-rUS/strings.xml
+++ b/core/res/res/values-es-rUS/strings.xml
@@ -1429,10 +1429,6 @@
<string name="submit" msgid="862795280643405865">"Enviar"</string>
<string name="car_mode_disable_notification_title" msgid="8450693275833142896">"Se está ejecutando la app de conducción"</string>
<string name="car_mode_disable_notification_message" msgid="8954550232288567515">"Presiona para salir de la app de conducción."</string>
- <string name="tethered_notification_title" msgid="2700523927485687353">"Anclaje a red o zona activa conectados"</string>
- <string name="tethered_notification_message" msgid="6228080755828019453">"Presiona para configurar."</string>
- <string name="disable_tether_notification_title" msgid="7158047514545848391">"Se inhabilitó la conexión mediante dispositivo portátil"</string>
- <string name="disable_tether_notification_message" msgid="98281313984014775">"Para obtener más información, comunícate con el administrador"</string>
<string name="back_button_label" msgid="4078224038025043387">"Atrás"</string>
<string name="next_button_label" msgid="6040209156399907780">"Siguiente"</string>
<string name="skip_button_label" msgid="3566599811326688389">"Omitir"</string>
diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml
index 2e749043299a..81f210ba03b3 100644
--- a/core/res/res/values-es/strings.xml
+++ b/core/res/res/values-es/strings.xml
@@ -1429,10 +1429,6 @@
<string name="submit" msgid="862795280643405865">"Enviar"</string>
<string name="car_mode_disable_notification_title" msgid="8450693275833142896">"Aplicación de conducción en uso"</string>
<string name="car_mode_disable_notification_message" msgid="8954550232288567515">"Toca para salir de la aplicación de conducción."</string>
- <string name="tethered_notification_title" msgid="2700523927485687353">"Compartir conexión/Zona Wi-Fi activada"</string>
- <string name="tethered_notification_message" msgid="6228080755828019453">"Toca para configurar."</string>
- <string name="disable_tether_notification_title" msgid="7158047514545848391">"La conexión compartida está inhabilitada"</string>
- <string name="disable_tether_notification_message" msgid="98281313984014775">"Ponte en contacto con el administrador para obtener más información"</string>
<string name="back_button_label" msgid="4078224038025043387">"Atrás"</string>
<string name="next_button_label" msgid="6040209156399907780">"Siguiente"</string>
<string name="skip_button_label" msgid="3566599811326688389">"Saltar"</string>
diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml
index 85612549de25..61b18bbb9b39 100644
--- a/core/res/res/values-et/strings.xml
+++ b/core/res/res/values-et/strings.xml
@@ -1429,10 +1429,6 @@
<string name="submit" msgid="862795280643405865">"Saada"</string>
<string name="car_mode_disable_notification_title" msgid="8450693275833142896">"Sõidurakendus töötab"</string>
<string name="car_mode_disable_notification_message" msgid="8954550232288567515">"Puudutage sõidurakendusest väljumiseks."</string>
- <string name="tethered_notification_title" msgid="2700523927485687353">"Jagamine või kuumkoht on aktiivne"</string>
- <string name="tethered_notification_message" msgid="6228080755828019453">"Puudutage seadistamiseks."</string>
- <string name="disable_tether_notification_title" msgid="7158047514545848391">"Jagamine on keelatud"</string>
- <string name="disable_tether_notification_message" msgid="98281313984014775">"Lisateabe saamiseks võtke ühendust oma administraatoriga"</string>
<string name="back_button_label" msgid="4078224038025043387">"Tagasi"</string>
<string name="next_button_label" msgid="6040209156399907780">"Järgmine"</string>
<string name="skip_button_label" msgid="3566599811326688389">"Jäta vahele"</string>
diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml
index 263b5ed7e232..fda8565cbfa3 100644
--- a/core/res/res/values-eu/strings.xml
+++ b/core/res/res/values-eu/strings.xml
@@ -1429,10 +1429,6 @@
<string name="submit" msgid="862795280643405865">"Bidali"</string>
<string name="car_mode_disable_notification_title" msgid="8450693275833142896">"Abian da gidatzeko aplikazioa"</string>
<string name="car_mode_disable_notification_message" msgid="8954550232288567515">"Sakatu gidatzeko aplikaziotik irteteko."</string>
- <string name="tethered_notification_title" msgid="2700523927485687353">"Konexioa partekatzea edo sare publikoa aktibo"</string>
- <string name="tethered_notification_message" msgid="6228080755828019453">"Sakatu konfiguratzeko."</string>
- <string name="disable_tether_notification_title" msgid="7158047514545848391">"Desgaituta dago konexioa partekatzeko aukera"</string>
- <string name="disable_tether_notification_message" msgid="98281313984014775">"Xehetasunak lortzeko, jarri administratzailearekin harremanetan"</string>
<string name="back_button_label" msgid="4078224038025043387">"Atzera"</string>
<string name="next_button_label" msgid="6040209156399907780">"Hurrengoa"</string>
<string name="skip_button_label" msgid="3566599811326688389">"Saltatu"</string>
diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml
index 997b6aff7835..433d4f3def2e 100644
--- a/core/res/res/values-fa/strings.xml
+++ b/core/res/res/values-fa/strings.xml
@@ -1429,10 +1429,6 @@
<string name="submit" msgid="862795280643405865">"ارسال"</string>
<string name="car_mode_disable_notification_title" msgid="8450693275833142896">"برنامه رانندگی درحال اجرا است"</string>
<string name="car_mode_disable_notification_message" msgid="8954550232288567515">"برای خروج از برنامه رانندگی ضربه بزنید."</string>
- <string name="tethered_notification_title" msgid="2700523927485687353">"اشتراک‌گذاری اینترنت یا نقطه اتصال فعال"</string>
- <string name="tethered_notification_message" msgid="6228080755828019453">"برای راه‌اندازی ضربه بزنید."</string>
- <string name="disable_tether_notification_title" msgid="7158047514545848391">"اشتراک‌گذاری اینترنت غیرفعال است"</string>
- <string name="disable_tether_notification_message" msgid="98281313984014775">"برای جزئیات، با سرپرستتان تماس بگیرید"</string>
<string name="back_button_label" msgid="4078224038025043387">"برگشت"</string>
<string name="next_button_label" msgid="6040209156399907780">"بعدی"</string>
<string name="skip_button_label" msgid="3566599811326688389">"رد شدن"</string>
diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml
index 86badf6dbf89..0c7bd77fae4a 100644
--- a/core/res/res/values-fi/strings.xml
+++ b/core/res/res/values-fi/strings.xml
@@ -1429,10 +1429,6 @@
<string name="submit" msgid="862795280643405865">"Lähetä"</string>
<string name="car_mode_disable_notification_title" msgid="8450693275833142896">"Ajosovellus on käynnissä"</string>
<string name="car_mode_disable_notification_message" msgid="8954550232288567515">"Poistu ajosovelluksesta napauttamalla."</string>
- <string name="tethered_notification_title" msgid="2700523927485687353">"Internetin jakaminen tai yhteyspiste käytössä"</string>
- <string name="tethered_notification_message" msgid="6228080755828019453">"Määritä napauttamalla."</string>
- <string name="disable_tether_notification_title" msgid="7158047514545848391">"Yhteyden jakaminen poistettu käytöstä"</string>
- <string name="disable_tether_notification_message" msgid="98281313984014775">"Kysy lisätietoja järjestelmänvalvojalta."</string>
<string name="back_button_label" msgid="4078224038025043387">"Takaisin"</string>
<string name="next_button_label" msgid="6040209156399907780">"Seuraava"</string>
<string name="skip_button_label" msgid="3566599811326688389">"Ohita"</string>
diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml
index 2b890656d5dc..3c8f75fd83a7 100644
--- a/core/res/res/values-fr-rCA/strings.xml
+++ b/core/res/res/values-fr-rCA/strings.xml
@@ -1429,10 +1429,6 @@
<string name="submit" msgid="862795280643405865">"Envoyer"</string>
<string name="car_mode_disable_notification_title" msgid="8450693275833142896">"L\'application de conduite est en cours d\'exécution"</string>
<string name="car_mode_disable_notification_message" msgid="8954550232288567515">"Touchez pour quitter l\'application de conduite."</string>
- <string name="tethered_notification_title" msgid="2700523927485687353">"Partage de connexion ou point d\'accès sans fil activé"</string>
- <string name="tethered_notification_message" msgid="6228080755828019453">"Touchez pour configurer."</string>
- <string name="disable_tether_notification_title" msgid="7158047514545848391">"Le partage de connexion est désactivé"</string>
- <string name="disable_tether_notification_message" msgid="98281313984014775">"Communiquez avec votre administrateur pour obtenir plus de détails"</string>
<string name="back_button_label" msgid="4078224038025043387">"Précédent"</string>
<string name="next_button_label" msgid="6040209156399907780">"Suivante"</string>
<string name="skip_button_label" msgid="3566599811326688389">"Passer"</string>
diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml
index 7522b5aa26fb..1b53bd9ecd7f 100644
--- a/core/res/res/values-fr/strings.xml
+++ b/core/res/res/values-fr/strings.xml
@@ -1429,10 +1429,6 @@
<string name="submit" msgid="862795280643405865">"Envoyer"</string>
<string name="car_mode_disable_notification_title" msgid="8450693275833142896">"L\'application de conduite est en cours d\'exécution"</string>
<string name="car_mode_disable_notification_message" msgid="8954550232288567515">"Appuyez ici pour quitter l\'application de conduite."</string>
- <string name="tethered_notification_title" msgid="2700523927485687353">"Partage de connexion ou point d\'accès sans fil activé"</string>
- <string name="tethered_notification_message" msgid="6228080755828019453">"Appuyez ici pour configurer."</string>
- <string name="disable_tether_notification_title" msgid="7158047514545848391">"Le partage de connexion est désactivé"</string>
- <string name="disable_tether_notification_message" msgid="98281313984014775">"Pour en savoir plus, contactez votre administrateur"</string>
<string name="back_button_label" msgid="4078224038025043387">"Retour"</string>
<string name="next_button_label" msgid="6040209156399907780">"Suivant"</string>
<string name="skip_button_label" msgid="3566599811326688389">"Ignorer"</string>
diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml
index 4d40e214b1ba..4572db728bc0 100644
--- a/core/res/res/values-gl/strings.xml
+++ b/core/res/res/values-gl/strings.xml
@@ -1429,10 +1429,6 @@
<string name="submit" msgid="862795280643405865">"Enviar"</string>
<string name="car_mode_disable_notification_title" msgid="8450693275833142896">"Estase executando a aplicación de condución"</string>
<string name="car_mode_disable_notification_message" msgid="8954550232288567515">"Toca para saír da aplicación de condución."</string>
- <string name="tethered_notification_title" msgid="2700523927485687353">"Conexión compartida ou zona wifi activada"</string>
- <string name="tethered_notification_message" msgid="6228080755828019453">"Tocar para configurar."</string>
- <string name="disable_tether_notification_title" msgid="7158047514545848391">"A conexión compartida está desactivada"</string>
- <string name="disable_tether_notification_message" msgid="98281313984014775">"Contacta co administrador para obter información"</string>
<string name="back_button_label" msgid="4078224038025043387">"Volver"</string>
<string name="next_button_label" msgid="6040209156399907780">"Seguinte"</string>
<string name="skip_button_label" msgid="3566599811326688389">"Omitir"</string>
diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml
index ea3a573d7115..5e4f753f4018 100644
--- a/core/res/res/values-gu/strings.xml
+++ b/core/res/res/values-gu/strings.xml
@@ -1429,10 +1429,6 @@
<string name="submit" msgid="862795280643405865">"સબમિટ કરો"</string>
<string name="car_mode_disable_notification_title" msgid="8450693275833142896">"ડ્રાઇવિંગ ઍપ ચાલી રહી છે"</string>
<string name="car_mode_disable_notification_message" msgid="8954550232288567515">"ડ્રાઇવિંગ ઍપથી બહાર નીકળવા માટે ટૅપ કરો."</string>
- <string name="tethered_notification_title" msgid="2700523927485687353">"ટિથરિંગ અથવા હૉટસ્પૉટ સક્રિય"</string>
- <string name="tethered_notification_message" msgid="6228080755828019453">"સેટ કરવા માટે ટૅપ કરો."</string>
- <string name="disable_tether_notification_title" msgid="7158047514545848391">"ટિથરિંગ અક્ષમ કરેલ છે"</string>
- <string name="disable_tether_notification_message" msgid="98281313984014775">"વિગતો માટે તમારા વ્યવસ્થાપકનો સંપર્ક કરો"</string>
<string name="back_button_label" msgid="4078224038025043387">"પાછળ"</string>
<string name="next_button_label" msgid="6040209156399907780">"આગલું"</string>
<string name="skip_button_label" msgid="3566599811326688389">"છોડો"</string>
diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml
index e12fa08010b7..eecfd5b500db 100644
--- a/core/res/res/values-hi/strings.xml
+++ b/core/res/res/values-hi/strings.xml
@@ -1429,10 +1429,6 @@
<string name="submit" msgid="862795280643405865">"सबमिट करें"</string>
<string name="car_mode_disable_notification_title" msgid="8450693275833142896">"ड्राइविंग ऐप्लिकेशन चल रहा है"</string>
<string name="car_mode_disable_notification_message" msgid="8954550232288567515">"ड्राइविंग ऐप्लिकेशन से निकलने के लिए टैप करें."</string>
- <string name="tethered_notification_title" msgid="2700523927485687353">"टेदरिंग या हॉटस्‍पॉट सक्रिय"</string>
- <string name="tethered_notification_message" msgid="6228080755828019453">"सेट करने के लिए टैप करें."</string>
- <string name="disable_tether_notification_title" msgid="7158047514545848391">"टेदरिंग अक्षम है"</string>
- <string name="disable_tether_notification_message" msgid="98281313984014775">"जानकारी के लिए अपने एडमिन से संपर्क करें"</string>
<string name="back_button_label" msgid="4078224038025043387">"वापस जाएं"</string>
<string name="next_button_label" msgid="6040209156399907780">"आगे बढ़ें"</string>
<string name="skip_button_label" msgid="3566599811326688389">"अभी नहीं"</string>
diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml
index 0871d06bceff..e8f02b276cf0 100644
--- a/core/res/res/values-hr/strings.xml
+++ b/core/res/res/values-hr/strings.xml
@@ -1449,10 +1449,6 @@
<string name="submit" msgid="862795280643405865">"Pošalji"</string>
<string name="car_mode_disable_notification_title" msgid="8450693275833142896">"Pokrenuta je aplikacija za vožnju"</string>
<string name="car_mode_disable_notification_message" msgid="8954550232288567515">"Dodirnite za zatvaranje aplikacije za vožnju."</string>
- <string name="tethered_notification_title" msgid="2700523927485687353">"Ograničenje ili aktivan hotspot"</string>
- <string name="tethered_notification_message" msgid="6228080755828019453">"Dodirnite da biste postavili."</string>
- <string name="disable_tether_notification_title" msgid="7158047514545848391">"Modemsko je povezivanje onemogućeno"</string>
- <string name="disable_tether_notification_message" msgid="98281313984014775">"Obratite se administratoru da biste saznali pojedinosti"</string>
<string name="back_button_label" msgid="4078224038025043387">"Natrag"</string>
<string name="next_button_label" msgid="6040209156399907780">"Dalje"</string>
<string name="skip_button_label" msgid="3566599811326688389">"Preskoči"</string>
diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml
index ce11fc628693..1d1b99474938 100644
--- a/core/res/res/values-hu/strings.xml
+++ b/core/res/res/values-hu/strings.xml
@@ -1429,10 +1429,6 @@
<string name="submit" msgid="862795280643405865">"Elküldés"</string>
<string name="car_mode_disable_notification_title" msgid="8450693275833142896">"Az autós alkalmazás fut"</string>
<string name="car_mode_disable_notification_message" msgid="8954550232288567515">"Koppintson ide az autós alkalmazásból való kilépéshez."</string>
- <string name="tethered_notification_title" msgid="2700523927485687353">"Megosztás vagy aktív hotspot"</string>
- <string name="tethered_notification_message" msgid="6228080755828019453">"Koppintson a beállításhoz."</string>
- <string name="disable_tether_notification_title" msgid="7158047514545848391">"Az internetmegosztás le van tiltva"</string>
- <string name="disable_tether_notification_message" msgid="98281313984014775">"A részletekért forduljon rendszergazdájához"</string>
<string name="back_button_label" msgid="4078224038025043387">"Vissza"</string>
<string name="next_button_label" msgid="6040209156399907780">"Tovább"</string>
<string name="skip_button_label" msgid="3566599811326688389">"Kihagyás"</string>
diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml
index 629b225072e0..599ce864a4d3 100644
--- a/core/res/res/values-hy/strings.xml
+++ b/core/res/res/values-hy/strings.xml
@@ -1429,10 +1429,6 @@
<string name="submit" msgid="862795280643405865">"Ուղարկել"</string>
<string name="car_mode_disable_notification_title" msgid="8450693275833142896">"Հավելվածն աշխատում է"</string>
<string name="car_mode_disable_notification_message" msgid="8954550232288567515">"Հպեք՝ հավելվածը փակելու համար:"</string>
- <string name="tethered_notification_title" msgid="2700523927485687353">"Մոդեմի ռեժիմը միացված է"</string>
- <string name="tethered_notification_message" msgid="6228080755828019453">"Հպեք՝ կարգավորելու համար:"</string>
- <string name="disable_tether_notification_title" msgid="7158047514545848391">"Մոդեմի ռեժիմն անջատված է"</string>
- <string name="disable_tether_notification_message" msgid="98281313984014775">"Մանրամասների համար դիմեք ձեր ադմինիստրատորին"</string>
<string name="back_button_label" msgid="4078224038025043387">"Հետ"</string>
<string name="next_button_label" msgid="6040209156399907780">"Հաջորդը"</string>
<string name="skip_button_label" msgid="3566599811326688389">"Բաց թողնել"</string>
diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml
index f99c1076de17..1f81eb508bf3 100644
--- a/core/res/res/values-in/strings.xml
+++ b/core/res/res/values-in/strings.xml
@@ -1429,10 +1429,6 @@
<string name="submit" msgid="862795280643405865">"Kirim"</string>
<string name="car_mode_disable_notification_title" msgid="8450693275833142896">"Aplikasi mengemudi sedang berjalan"</string>
<string name="car_mode_disable_notification_message" msgid="8954550232288567515">"Ketuk untuk keluar dari aplikasi mengemudi."</string>
- <string name="tethered_notification_title" msgid="2700523927485687353">"Tethering (Penambatan) atau hotspot aktif"</string>
- <string name="tethered_notification_message" msgid="6228080755828019453">"Ketuk untuk menyiapkan."</string>
- <string name="disable_tether_notification_title" msgid="7158047514545848391">"Tethering dinonaktifkan"</string>
- <string name="disable_tether_notification_message" msgid="98281313984014775">"Hubungi admin untuk mengetahui detailnya"</string>
<string name="back_button_label" msgid="4078224038025043387">"Kembali"</string>
<string name="next_button_label" msgid="6040209156399907780">"Selanjutnya"</string>
<string name="skip_button_label" msgid="3566599811326688389">"Lewati"</string>
diff --git a/core/res/res/values-is/strings.xml b/core/res/res/values-is/strings.xml
index 0f4d6de4d399..d23cf5fff4a9 100644
--- a/core/res/res/values-is/strings.xml
+++ b/core/res/res/values-is/strings.xml
@@ -1429,10 +1429,6 @@
<string name="submit" msgid="862795280643405865">"Senda"</string>
<string name="car_mode_disable_notification_title" msgid="8450693275833142896">"Akstursforrit er í gangi"</string>
<string name="car_mode_disable_notification_message" msgid="8954550232288567515">"Ýttu til að loka akstursforritinu."</string>
- <string name="tethered_notification_title" msgid="2700523927485687353">"Kveikt á tjóðrun eða aðgangsstað"</string>
- <string name="tethered_notification_message" msgid="6228080755828019453">"Ýttu til að setja upp."</string>
- <string name="disable_tether_notification_title" msgid="7158047514545848391">"Slökkt er á tjóðrun"</string>
- <string name="disable_tether_notification_message" msgid="98281313984014775">"Hafðu samband við kerfisstjórann til að fá upplýsingar"</string>
<string name="back_button_label" msgid="4078224038025043387">"Til baka"</string>
<string name="next_button_label" msgid="6040209156399907780">"Áfram"</string>
<string name="skip_button_label" msgid="3566599811326688389">"Sleppa"</string>
diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml
index f14e8582b374..8ebcb0e07405 100644
--- a/core/res/res/values-it/strings.xml
+++ b/core/res/res/values-it/strings.xml
@@ -1429,10 +1429,6 @@
<string name="submit" msgid="862795280643405865">"Invia"</string>
<string name="car_mode_disable_notification_title" msgid="8450693275833142896">"App di guida in esecuzione"</string>
<string name="car_mode_disable_notification_message" msgid="8954550232288567515">"Tocca per uscire dall\'app di guida."</string>
- <string name="tethered_notification_title" msgid="2700523927485687353">"Tethering oppure hotspot attivo"</string>
- <string name="tethered_notification_message" msgid="6228080755828019453">"Tocca per impostare."</string>
- <string name="disable_tether_notification_title" msgid="7158047514545848391">"Tethering disattivato"</string>
- <string name="disable_tether_notification_message" msgid="98281313984014775">"Contatta il tuo amministratore per avere informazioni dettagliate"</string>
<string name="back_button_label" msgid="4078224038025043387">"Indietro"</string>
<string name="next_button_label" msgid="6040209156399907780">"Avanti"</string>
<string name="skip_button_label" msgid="3566599811326688389">"Ignora"</string>
diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml
index 375d7d110a6b..85d0f3b5fee7 100644
--- a/core/res/res/values-iw/strings.xml
+++ b/core/res/res/values-iw/strings.xml
@@ -1469,10 +1469,6 @@
<string name="submit" msgid="862795280643405865">"שלח"</string>
<string name="car_mode_disable_notification_title" msgid="8450693275833142896">"אפליקציית הנהיגה פועלת"</string>
<string name="car_mode_disable_notification_message" msgid="8954550232288567515">"יש להקיש כדי לצאת מאפליקציית הנהיגה."</string>
- <string name="tethered_notification_title" msgid="2700523927485687353">"שיתוף אינטרנט פעיל"</string>
- <string name="tethered_notification_message" msgid="6228080755828019453">"הקש כדי להגדיר."</string>
- <string name="disable_tether_notification_title" msgid="7158047514545848391">"שיתוף האינטרנט בין ניידים מושבת"</string>
- <string name="disable_tether_notification_message" msgid="98281313984014775">"לפרטים, יש לפנות למנהל המערכת"</string>
<string name="back_button_label" msgid="4078224038025043387">"הקודם"</string>
<string name="next_button_label" msgid="6040209156399907780">"הבא"</string>
<string name="skip_button_label" msgid="3566599811326688389">"דילוג"</string>
diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml
index eb990ec02f87..e21035f06ac4 100644
--- a/core/res/res/values-ja/strings.xml
+++ b/core/res/res/values-ja/strings.xml
@@ -1429,10 +1429,6 @@
<string name="submit" msgid="862795280643405865">"送信"</string>
<string name="car_mode_disable_notification_title" msgid="8450693275833142896">"運転アプリを実行しています"</string>
<string name="car_mode_disable_notification_message" msgid="8954550232288567515">"運転アプリを終了するにはタップしてください。"</string>
- <string name="tethered_notification_title" msgid="2700523927485687353">"テザリングまたはアクセスポイントが有効です"</string>
- <string name="tethered_notification_message" msgid="6228080755828019453">"タップしてセットアップします。"</string>
- <string name="disable_tether_notification_title" msgid="7158047514545848391">"テザリングは無効に設定されています"</string>
- <string name="disable_tether_notification_message" msgid="98281313984014775">"詳しくは、管理者にお問い合わせください"</string>
<string name="back_button_label" msgid="4078224038025043387">"戻る"</string>
<string name="next_button_label" msgid="6040209156399907780">"次へ"</string>
<string name="skip_button_label" msgid="3566599811326688389">"スキップ"</string>
diff --git a/core/res/res/values-ka/strings.xml b/core/res/res/values-ka/strings.xml
index d2d1fed80059..941dbbd208ab 100644
--- a/core/res/res/values-ka/strings.xml
+++ b/core/res/res/values-ka/strings.xml
@@ -1429,10 +1429,6 @@
<string name="submit" msgid="862795280643405865">"გაგზავნა"</string>
<string name="car_mode_disable_notification_title" msgid="8450693275833142896">"მართვის აპი გაშვებულია"</string>
<string name="car_mode_disable_notification_message" msgid="8954550232288567515">"შეეხეთ მართვის აპიდან გასასვლელად."</string>
- <string name="tethered_notification_title" msgid="2700523927485687353">"ტეტერინგი ან უსადენო ქსელი აქტიურია"</string>
- <string name="tethered_notification_message" msgid="6228080755828019453">"შეეხეთ დასაყენებლად."</string>
- <string name="disable_tether_notification_title" msgid="7158047514545848391">"ტეტერინგი გათიშულია"</string>
- <string name="disable_tether_notification_message" msgid="98281313984014775">"დამატებითი ინფორმაციისთვის დაუკავშირდით თქვენს ადმინისტრატორს"</string>
<string name="back_button_label" msgid="4078224038025043387">"უკან"</string>
<string name="next_button_label" msgid="6040209156399907780">"მომდევნო"</string>
<string name="skip_button_label" msgid="3566599811326688389">"გამოტოვება"</string>
diff --git a/core/res/res/values-kk/strings.xml b/core/res/res/values-kk/strings.xml
index a1002f719a55..b142e5851f8c 100644
--- a/core/res/res/values-kk/strings.xml
+++ b/core/res/res/values-kk/strings.xml
@@ -1429,10 +1429,6 @@
<string name="submit" msgid="862795280643405865">"Жіберу"</string>
<string name="car_mode_disable_notification_title" msgid="8450693275833142896">"Көлік жүргізу қолданбасы қосулы"</string>
<string name="car_mode_disable_notification_message" msgid="8954550232288567515">"Көлік жүргізу қолданбасынан шығу үшін түртіңіз."</string>
- <string name="tethered_notification_title" msgid="2700523927485687353">"Тетеринг немесе хотспот қосулы"</string>
- <string name="tethered_notification_message" msgid="6228080755828019453">"Реттеу үшін түртіңіз."</string>
- <string name="disable_tether_notification_title" msgid="7158047514545848391">"Тетеринг өшірілді"</string>
- <string name="disable_tether_notification_message" msgid="98281313984014775">"Мәліметтерді әкімшіден алыңыз"</string>
<string name="back_button_label" msgid="4078224038025043387">"Артқа"</string>
<string name="next_button_label" msgid="6040209156399907780">"Келесі"</string>
<string name="skip_button_label" msgid="3566599811326688389">"Өткізіп жіберу"</string>
diff --git a/core/res/res/values-km/strings.xml b/core/res/res/values-km/strings.xml
index 61a3ec6fb444..43289eb4dffe 100644
--- a/core/res/res/values-km/strings.xml
+++ b/core/res/res/values-km/strings.xml
@@ -1431,10 +1431,6 @@
<string name="submit" msgid="862795280643405865">"ដាក់​ស្នើ"</string>
<string name="car_mode_disable_notification_title" msgid="8450693275833142896">"កម្មវិធី​បើកបរ​កំពុង​ដំណើរការ"</string>
<string name="car_mode_disable_notification_message" msgid="8954550232288567515">"ចុច​ដើម្បី​ចាកចេញ​ពីកម្មវិធី​បើកបរ។"</string>
- <string name="tethered_notification_title" msgid="2700523927485687353">"ភ្ជាប់ ឬ​ហតស្ពត​សកម្ម"</string>
- <string name="tethered_notification_message" msgid="6228080755828019453">"ប៉ះដើម្បីកំណត់"</string>
- <string name="disable_tether_notification_title" msgid="7158047514545848391">"ការភ្ជាប់​ត្រូវបានបិទ"</string>
- <string name="disable_tether_notification_message" msgid="98281313984014775">"ទាក់ទងអ្នកគ្រប់គ្រង​របស់អ្នកសម្រាប់​ព័ត៌មានលម្អិត"</string>
<string name="back_button_label" msgid="4078224038025043387">"ថយក្រោយ"</string>
<string name="next_button_label" msgid="6040209156399907780">"បន្ទាប់​"</string>
<string name="skip_button_label" msgid="3566599811326688389">"រំលង"</string>
diff --git a/core/res/res/values-kn/strings.xml b/core/res/res/values-kn/strings.xml
index 5524d400027f..6ebe7b490800 100644
--- a/core/res/res/values-kn/strings.xml
+++ b/core/res/res/values-kn/strings.xml
@@ -1429,10 +1429,6 @@
<string name="submit" msgid="862795280643405865">"ಸಲ್ಲಿಸು"</string>
<string name="car_mode_disable_notification_title" msgid="8450693275833142896">"ಡ್ರೈವಿಂಗ್‌ ಅಪ್ಲಿಕೇಶನ್ ಚಾಲನೆಯಲ್ಲಿದೆ"</string>
<string name="car_mode_disable_notification_message" msgid="8954550232288567515">"ಡ್ರೈವಿಂಗ್‌ ಅಪ್ಲಿಕೇಶನ್ ನಿರ್ಗಮಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
- <string name="tethered_notification_title" msgid="2700523927485687353">"ಟೆಥರಿಂಗ್ ಅಥವಾ ಹಾಟ್‌ಸ್ಪಾಟ್ ಸಕ್ರಿಯವಾಗಿದೆ"</string>
- <string name="tethered_notification_message" msgid="6228080755828019453">"ಹೊಂದಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
- <string name="disable_tether_notification_title" msgid="7158047514545848391">"ಟೆಥರಿಂಗ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ"</string>
- <string name="disable_tether_notification_message" msgid="98281313984014775">"ವಿವರಗಳಿಗಾಗಿ ನಿಮ್ಮ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಿ"</string>
<string name="back_button_label" msgid="4078224038025043387">"ಹಿಂದೆ"</string>
<string name="next_button_label" msgid="6040209156399907780">"ಮುಂದಿನದು"</string>
<string name="skip_button_label" msgid="3566599811326688389">"ಸ್ಕಿಪ್‌"</string>
diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml
index 423dbd6749cb..c6caedf170cd 100644
--- a/core/res/res/values-ko/strings.xml
+++ b/core/res/res/values-ko/strings.xml
@@ -1429,10 +1429,6 @@
<string name="submit" msgid="862795280643405865">"제출"</string>
<string name="car_mode_disable_notification_title" msgid="8450693275833142896">"운전 앱 실행 중"</string>
<string name="car_mode_disable_notification_message" msgid="8954550232288567515">"운전 앱을 종료하려면 탭하세요."</string>
- <string name="tethered_notification_title" msgid="2700523927485687353">"테더링 또는 핫스팟 사용"</string>
- <string name="tethered_notification_message" msgid="6228080755828019453">"설정하려면 탭하세요."</string>
- <string name="disable_tether_notification_title" msgid="7158047514545848391">"테더링이 사용 중지됨"</string>
- <string name="disable_tether_notification_message" msgid="98281313984014775">"자세한 정보는 관리자에게 문의하세요."</string>
<string name="back_button_label" msgid="4078224038025043387">"뒤로"</string>
<string name="next_button_label" msgid="6040209156399907780">"다음"</string>
<string name="skip_button_label" msgid="3566599811326688389">"건너뛰기"</string>
diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml
index d1d773c03d77..341c99618633 100644
--- a/core/res/res/values-ky/strings.xml
+++ b/core/res/res/values-ky/strings.xml
@@ -1429,10 +1429,6 @@
<string name="submit" msgid="862795280643405865">"Тапшыруу"</string>
<string name="car_mode_disable_notification_title" msgid="8450693275833142896">"Унаа айдоо колдонмосу иштеп жатат"</string>
<string name="car_mode_disable_notification_message" msgid="8954550232288567515">"Унаа айдоо колдонмосунан чыгуу үчүн таптаңыз."</string>
- <string name="tethered_notification_title" msgid="2700523927485687353">"Жалгаштыруу же хотспот жандырылган"</string>
- <string name="tethered_notification_message" msgid="6228080755828019453">"Жөндөө үчүн таптап коюңуз."</string>
- <string name="disable_tether_notification_title" msgid="7158047514545848391">"Жалгаштыруу функциясы өчүрүлгөн"</string>
- <string name="disable_tether_notification_message" msgid="98281313984014775">"Кеңири маалымат үчүн администраторуңузга кайрылыңыз"</string>
<string name="back_button_label" msgid="4078224038025043387">"Артка"</string>
<string name="next_button_label" msgid="6040209156399907780">"Кийинки"</string>
<string name="skip_button_label" msgid="3566599811326688389">"Өткөрүп жиберүү"</string>
diff --git a/core/res/res/values-lo/strings.xml b/core/res/res/values-lo/strings.xml
index ded2a4fbf8e2..e0da2064301c 100644
--- a/core/res/res/values-lo/strings.xml
+++ b/core/res/res/values-lo/strings.xml
@@ -1429,10 +1429,6 @@
<string name="submit" msgid="862795280643405865">"ສົ່ງຂໍ້ມູນ"</string>
<string name="car_mode_disable_notification_title" msgid="8450693275833142896">"ແອັບຂັບລົດກຳລັງເຮັດວຽກຢູ່"</string>
<string name="car_mode_disable_notification_message" msgid="8954550232288567515">"ແຕະເພື່ອອອກຈາກແອັບຂັບລົດ."</string>
- <string name="tethered_notification_title" msgid="2700523927485687353">"ເປີດ​ການ​ປ່ອຍ​ສັນຍານ ຫຼື​ຮັອດສະປອດ​ແລ້ວ"</string>
- <string name="tethered_notification_message" msgid="6228080755828019453">"ແຕະເພື່ອຕັ້ງຄ່າ."</string>
- <string name="disable_tether_notification_title" msgid="7158047514545848391">"ການປ່ອຍສັນຍານຖືກປິດໄວ້"</string>
- <string name="disable_tether_notification_message" msgid="98281313984014775">"ຕິດຕໍ່ຜູ້ເບິ່ງແຍງລະບົບສຳລັບລາຍລະອຽດ"</string>
<string name="back_button_label" msgid="4078224038025043387">"ກັບຄືນ"</string>
<string name="next_button_label" msgid="6040209156399907780">"ຕໍ່ໄປ"</string>
<string name="skip_button_label" msgid="3566599811326688389">"ຂ້າມ"</string>
diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml
index eac535c7b3c2..1212aa44fa93 100644
--- a/core/res/res/values-lt/strings.xml
+++ b/core/res/res/values-lt/strings.xml
@@ -1469,10 +1469,6 @@
<string name="submit" msgid="862795280643405865">"Pateikti"</string>
<string name="car_mode_disable_notification_title" msgid="8450693275833142896">"Veikia vairavimo programa"</string>
<string name="car_mode_disable_notification_message" msgid="8954550232288567515">"Palieskite, kad išeitumėte iš vairavimo programos."</string>
- <string name="tethered_notification_title" msgid="2700523927485687353">"Susietas ar aktyvus"</string>
- <string name="tethered_notification_message" msgid="6228080755828019453">"Palieskite, kad nustatytumėte."</string>
- <string name="disable_tether_notification_title" msgid="7158047514545848391">"Įrenginio kaip modemo naudojimas išjungtas"</string>
- <string name="disable_tether_notification_message" msgid="98281313984014775">"Jei reikia išsamios informacijos, susisiekite su administratoriumi"</string>
<string name="back_button_label" msgid="4078224038025043387">"Atgal"</string>
<string name="next_button_label" msgid="6040209156399907780">"Kitas"</string>
<string name="skip_button_label" msgid="3566599811326688389">"Praleisti"</string>
diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml
index f586212653ad..547b6c9bfbe3 100644
--- a/core/res/res/values-lv/strings.xml
+++ b/core/res/res/values-lv/strings.xml
@@ -1449,10 +1449,6 @@
<string name="submit" msgid="862795280643405865">"Iesniegt"</string>
<string name="car_mode_disable_notification_title" msgid="8450693275833142896">"Autovadīšanas lietotne darbojas"</string>
<string name="car_mode_disable_notification_message" msgid="8954550232288567515">"Pieskarieties, lai izietu no autovadīšanas lietotnes"</string>
- <string name="tethered_notification_title" msgid="2700523927485687353">"Piesaiste vai tīklājs ir aktīvs."</string>
- <string name="tethered_notification_message" msgid="6228080755828019453">"Pieskarieties, lai iestatītu."</string>
- <string name="disable_tether_notification_title" msgid="7158047514545848391">"Piesaiste ir atspējota"</string>
- <string name="disable_tether_notification_message" msgid="98281313984014775">"Lai iegūtu detalizētu informāciju, sazinieties ar savu administratoru."</string>
<string name="back_button_label" msgid="4078224038025043387">"Atpakaļ"</string>
<string name="next_button_label" msgid="6040209156399907780">"Tālāk"</string>
<string name="skip_button_label" msgid="3566599811326688389">"Izlaist"</string>
diff --git a/core/res/res/values-mk/strings.xml b/core/res/res/values-mk/strings.xml
index 0d308a1d9b8d..93f2da11e7bb 100644
--- a/core/res/res/values-mk/strings.xml
+++ b/core/res/res/values-mk/strings.xml
@@ -1429,10 +1429,6 @@
<string name="submit" msgid="862795280643405865">"Поднеси"</string>
<string name="car_mode_disable_notification_title" msgid="8450693275833142896">"Апликацијата за возење работи"</string>
<string name="car_mode_disable_notification_message" msgid="8954550232288567515">"Допрете за да излезете од апликацијата за возење."</string>
- <string name="tethered_notification_title" msgid="2700523927485687353">"Поврзувањето или точката на пристап се активни"</string>
- <string name="tethered_notification_message" msgid="6228080755828019453">"Допрете за поставување."</string>
- <string name="disable_tether_notification_title" msgid="7158047514545848391">"Врзувањето е оневозможено"</string>
- <string name="disable_tether_notification_message" msgid="98281313984014775">"Контактирајте со администраторот за детали"</string>
<string name="back_button_label" msgid="4078224038025043387">"Назад"</string>
<string name="next_button_label" msgid="6040209156399907780">"Следно"</string>
<string name="skip_button_label" msgid="3566599811326688389">"Прескокни"</string>
diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml
index 63a7194c114f..c220cddd9f07 100644
--- a/core/res/res/values-ml/strings.xml
+++ b/core/res/res/values-ml/strings.xml
@@ -1429,10 +1429,6 @@
<string name="submit" msgid="862795280643405865">"സമർപ്പിക്കുക"</string>
<string name="car_mode_disable_notification_title" msgid="8450693275833142896">"ഡ്രൈവിംഗ് ആപ്പ് റൺ ചെയ്യുകയാണ്"</string>
<string name="car_mode_disable_notification_message" msgid="8954550232288567515">"ഡ്രൈവിംഗ് ആപ്പിൽ നിന്ന് പുറത്തുകടക്കാൻ ടാപ്പ് ചെയ്യുക."</string>
- <string name="tethered_notification_title" msgid="2700523927485687353">"ടെതറിംഗ് അല്ലെങ്കിൽ ഹോട്ട്സ്‌പോട്ട് സജീവമാണ്"</string>
- <string name="tethered_notification_message" msgid="6228080755828019453">"സജ്ജമാക്കാൻ ടാപ്പുചെയ്യുക."</string>
- <string name="disable_tether_notification_title" msgid="7158047514545848391">"ടെതറിംഗ് പ്രവർത്തനരഹിതമാക്കിയിരിക്കുന്നു"</string>
- <string name="disable_tether_notification_message" msgid="98281313984014775">"വിശദവിവരങ്ങൾക്ക് നിങ്ങളുടെ അഡ്മിനെ ബന്ധപ്പെടുക"</string>
<string name="back_button_label" msgid="4078224038025043387">"മടങ്ങുക"</string>
<string name="next_button_label" msgid="6040209156399907780">"അടുത്തത്"</string>
<string name="skip_button_label" msgid="3566599811326688389">"ഒഴിവാക്കുക"</string>
diff --git a/core/res/res/values-mn/strings.xml b/core/res/res/values-mn/strings.xml
index b3cf5ce92aea..8c261131d103 100644
--- a/core/res/res/values-mn/strings.xml
+++ b/core/res/res/values-mn/strings.xml
@@ -1429,10 +1429,6 @@
<string name="submit" msgid="862795280643405865">"Илгээх"</string>
<string name="car_mode_disable_notification_title" msgid="8450693275833142896">"Жолоо барих апп ажиллаж байна"</string>
<string name="car_mode_disable_notification_message" msgid="8954550232288567515">"Жолооны аппаас гарахын тулд товшино уу."</string>
- <string name="tethered_notification_title" msgid="2700523927485687353">"Модем болгох эсвэл идэвхтэй цэг болгох"</string>
- <string name="tethered_notification_message" msgid="6228080755828019453">"Тохируулахын тулд товшино уу."</string>
- <string name="disable_tether_notification_title" msgid="7158047514545848391">"Модем болгох боломжгүй байна"</string>
- <string name="disable_tether_notification_message" msgid="98281313984014775">"Дэлгэрэнгүй мэдээлэл авахын тулд админтайгаа холбогдоно уу"</string>
<string name="back_button_label" msgid="4078224038025043387">"Буцах"</string>
<string name="next_button_label" msgid="6040209156399907780">"Дараах"</string>
<string name="skip_button_label" msgid="3566599811326688389">"Алгасах"</string>
diff --git a/core/res/res/values-mr/strings.xml b/core/res/res/values-mr/strings.xml
index 22b1dcc4da9b..2782cafb7dbe 100644
--- a/core/res/res/values-mr/strings.xml
+++ b/core/res/res/values-mr/strings.xml
@@ -1429,10 +1429,6 @@
<string name="submit" msgid="862795280643405865">"सबमिट करा"</string>
<string name="car_mode_disable_notification_title" msgid="8450693275833142896">"ड्रायव्हिंग अ‍ॅप चालू आहे"</string>
<string name="car_mode_disable_notification_message" msgid="8954550232288567515">"ड्रायव्हिंग ॲपमधून बाहेर पाडण्यासाठी टॅप करा."</string>
- <string name="tethered_notification_title" msgid="2700523927485687353">"टेदरिंग किंवा हॉटस्पॉट सक्रिय"</string>
- <string name="tethered_notification_message" msgid="6228080755828019453">"सेट करण्यासाठी टॅप करा."</string>
- <string name="disable_tether_notification_title" msgid="7158047514545848391">"टेदरिंग बंद आहे"</string>
- <string name="disable_tether_notification_message" msgid="98281313984014775">"तपशीलांसाठी तुमच्या प्रशासकाशी संपर्क साधा"</string>
<string name="back_button_label" msgid="4078224038025043387">"मागे"</string>
<string name="next_button_label" msgid="6040209156399907780">"पुढील"</string>
<string name="skip_button_label" msgid="3566599811326688389">"वगळा"</string>
diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml
index 88c12b64636a..a40eca089c9a 100644
--- a/core/res/res/values-ms/strings.xml
+++ b/core/res/res/values-ms/strings.xml
@@ -1429,10 +1429,6 @@
<string name="submit" msgid="862795280643405865">"Serah"</string>
<string name="car_mode_disable_notification_title" msgid="8450693275833142896">"Apl memandu sedang berjalan"</string>
<string name="car_mode_disable_notification_message" msgid="8954550232288567515">"Ketik untuk keluar daripada apl memandu."</string>
- <string name="tethered_notification_title" msgid="2700523927485687353">"Penambatan atau titik panas aktif"</string>
- <string name="tethered_notification_message" msgid="6228080755828019453">"Ketik untuk membuat persediaan."</string>
- <string name="disable_tether_notification_title" msgid="7158047514545848391">"Penambatan dilumpuhkan"</string>
- <string name="disable_tether_notification_message" msgid="98281313984014775">"Hubungi pentadbir anda untuk maklumat lanjut"</string>
<string name="back_button_label" msgid="4078224038025043387">"Kembali"</string>
<string name="next_button_label" msgid="6040209156399907780">"Seterusnya"</string>
<string name="skip_button_label" msgid="3566599811326688389">"Langkau"</string>
diff --git a/core/res/res/values-my/strings.xml b/core/res/res/values-my/strings.xml
index cdf68cd3d53c..64e2376fe7b3 100644
--- a/core/res/res/values-my/strings.xml
+++ b/core/res/res/values-my/strings.xml
@@ -1429,10 +1429,6 @@
<string name="submit" msgid="862795280643405865">"ပေးပို့ရန်"</string>
<string name="car_mode_disable_notification_title" msgid="8450693275833142896">"ကားမောင်းသည့်အက်ပ် ပွင့်နေပါသည်"</string>
<string name="car_mode_disable_notification_message" msgid="8954550232288567515">"ကားမောင်းသည့်အက်ပ်မှ ထွက်ရန် တို့ပါ။"</string>
- <string name="tethered_notification_title" msgid="2700523927485687353">"တဆင့်ပြန်လည်လွှင့်ခြင်း သို့မဟုတ် ဟော့စပေါ့ ဖွင့်ထားသည်"</string>
- <string name="tethered_notification_message" msgid="6228080755828019453">"စနစ်ထည့်သွင်းရန် တို့ပါ။"</string>
- <string name="disable_tether_notification_title" msgid="7158047514545848391">"မိုဘိုင်းဖုန်းကို မိုဒမ်အဖြစ်သုံးခြင်းအား ပိတ်ထားသည်"</string>
- <string name="disable_tether_notification_message" msgid="98281313984014775">"အသေးစိတ်အချက်အလက်များအတွက် သင့်စီမံခန့်ခွဲသူကို ဆက်သွယ်ပါ"</string>
<string name="back_button_label" msgid="4078224038025043387">"နောက်သို့"</string>
<string name="next_button_label" msgid="6040209156399907780">"ရှေ့သို့"</string>
<string name="skip_button_label" msgid="3566599811326688389">"ကျော်ရန်"</string>
diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml
index b129c3c01b00..69e341ecc845 100644
--- a/core/res/res/values-nb/strings.xml
+++ b/core/res/res/values-nb/strings.xml
@@ -1429,10 +1429,6 @@
<string name="submit" msgid="862795280643405865">"Send inn"</string>
<string name="car_mode_disable_notification_title" msgid="8450693275833142896">"Kjøreappen kjører"</string>
<string name="car_mode_disable_notification_message" msgid="8954550232288567515">"Trykk for å lukke kjøreappen."</string>
- <string name="tethered_notification_title" msgid="2700523927485687353">"Internettdeling eller trådløs sone er aktiv"</string>
- <string name="tethered_notification_message" msgid="6228080755828019453">"Trykk for å konfigurere."</string>
- <string name="disable_tether_notification_title" msgid="7158047514545848391">"Internettdeling er slått av"</string>
- <string name="disable_tether_notification_message" msgid="98281313984014775">"Ta kontakt med administratoren din for å få mer informasjon"</string>
<string name="back_button_label" msgid="4078224038025043387">"Tilbake"</string>
<string name="next_button_label" msgid="6040209156399907780">"Neste"</string>
<string name="skip_button_label" msgid="3566599811326688389">"Hopp over"</string>
diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml
index 648f47c99871..0fb2213eea21 100644
--- a/core/res/res/values-ne/strings.xml
+++ b/core/res/res/values-ne/strings.xml
@@ -1435,10 +1435,6 @@
<string name="submit" msgid="862795280643405865">"पेस गर्नुहोस्"</string>
<string name="car_mode_disable_notification_title" msgid="8450693275833142896">"ड्राइभिङ अनुप्रयोग चलिरहेको छ"</string>
<string name="car_mode_disable_notification_message" msgid="8954550232288567515">"ड्राइभिङ अनुप्रयोगबाट बाहिर निस्कन ट्याप गर्नुहोस्।"</string>
- <string name="tethered_notification_title" msgid="2700523927485687353">"टेथर गर्ने वा हटस्पट सक्रिय"</string>
- <string name="tethered_notification_message" msgid="6228080755828019453">"सेटअप गर्न ट्याप गर्नुहोस्।"</string>
- <string name="disable_tether_notification_title" msgid="7158047514545848391">"टेदरिङलाई असक्षम पारिएको छ"</string>
- <string name="disable_tether_notification_message" msgid="98281313984014775">"विवरणहरूका लागि आफ्ना प्रशासकलाई सम्पर्क गर्नुहोस्"</string>
<string name="back_button_label" msgid="4078224038025043387">"पछाडि"</string>
<string name="next_button_label" msgid="6040209156399907780">"अर्को"</string>
<string name="skip_button_label" msgid="3566599811326688389">"छोड्नुहोस्"</string>
diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml
index e248ca1ed1d0..363c3c3184bc 100644
--- a/core/res/res/values-nl/strings.xml
+++ b/core/res/res/values-nl/strings.xml
@@ -1429,10 +1429,6 @@
<string name="submit" msgid="862795280643405865">"Verzenden"</string>
<string name="car_mode_disable_notification_title" msgid="8450693275833142896">"Auto-app wordt uitgevoerd"</string>
<string name="car_mode_disable_notification_message" msgid="8954550232288567515">"Tik om de auto-app te sluiten."</string>
- <string name="tethered_notification_title" msgid="2700523927485687353">"Tethering of hotspot actief"</string>
- <string name="tethered_notification_message" msgid="6228080755828019453">"Tik om in te stellen."</string>
- <string name="disable_tether_notification_title" msgid="7158047514545848391">"Tethering is uitgeschakeld"</string>
- <string name="disable_tether_notification_message" msgid="98281313984014775">"Neem contact op met je beheerder voor meer informatie"</string>
<string name="back_button_label" msgid="4078224038025043387">"Vorige"</string>
<string name="next_button_label" msgid="6040209156399907780">"Volgende"</string>
<string name="skip_button_label" msgid="3566599811326688389">"Overslaan"</string>
diff --git a/core/res/res/values-or/strings.xml b/core/res/res/values-or/strings.xml
index 7a73cc61633d..566d778e3d60 100644
--- a/core/res/res/values-or/strings.xml
+++ b/core/res/res/values-or/strings.xml
@@ -1429,10 +1429,6 @@
<string name="submit" msgid="862795280643405865">"ଦାଖଲ କରନ୍ତୁ"</string>
<string name="car_mode_disable_notification_title" msgid="8450693275833142896">"ଡ୍ରାଇଭିଙ୍ଗ ଆପ୍ ଚାଲୁଛି"</string>
<string name="car_mode_disable_notification_message" msgid="8954550232288567515">"ଡ୍ରାଇଭିଙ୍ଗ ଆପ୍‌ରୁ ବାହାରିବା ପାଇଁ ଟାପ୍ କରନ୍ତୁ।"</string>
- <string name="tethered_notification_title" msgid="2700523927485687353">"ଟିଥରିଙ୍ଗ କିମ୍ୱା ହଟସ୍ପଟ୍‌ ସକ୍ରିୟ ଅଛି"</string>
- <string name="tethered_notification_message" msgid="6228080755828019453">"ସେଟଅପ୍‍ କରିବାକୁ ଟାପ୍‍ କରନ୍ତୁ।"</string>
- <string name="disable_tether_notification_title" msgid="7158047514545848391">"ଟିଥରିଙ୍ଗ ଅକ୍ଷମ କରାଯାଇଛି"</string>
- <string name="disable_tether_notification_message" msgid="98281313984014775">"ବିବରଣୀ ପାଇଁ ନିଜ ଆଡମିନ୍‌ଙ୍କ ସହ ଯୋଗାଯୋଗ କରନ୍ତୁ"</string>
<string name="back_button_label" msgid="4078224038025043387">"ଫେରନ୍ତୁ"</string>
<string name="next_button_label" msgid="6040209156399907780">"ପରବର୍ତ୍ତୀ"</string>
<string name="skip_button_label" msgid="3566599811326688389">"ଛାଡ଼ିଦିଅନ୍ତୁ"</string>
diff --git a/core/res/res/values-pa/strings.xml b/core/res/res/values-pa/strings.xml
index 3a245e383bc5..7760db00b3ee 100644
--- a/core/res/res/values-pa/strings.xml
+++ b/core/res/res/values-pa/strings.xml
@@ -1429,10 +1429,6 @@
<string name="submit" msgid="862795280643405865">"ਪ੍ਰਸਤੁਤ ਕਰੋ"</string>
<string name="car_mode_disable_notification_title" msgid="8450693275833142896">"ਗੱਡੀ ਚਲਾਉਣ ਸੰਬੰਧੀ ਐਪ ਚੱਲ ਰਹੀ ਹੈ"</string>
<string name="car_mode_disable_notification_message" msgid="8954550232288567515">"ਗੱਡੀ ਚਲਾਉਣ ਸੰਬੰਧੀ ਐਪ ਤੋਂ ਬਾਹਰ ਜਾਣ ਲਈ ਟੈਪ ਕਰੋ।"</string>
- <string name="tethered_notification_title" msgid="2700523927485687353">"ਟੈਦਰਿੰਗ ਜਾਂ ਹੌਟਸਪੌਟ ਕਿਰਿਆਸ਼ੀਲ"</string>
- <string name="tethered_notification_message" msgid="6228080755828019453">"ਸਥਾਪਤ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ।"</string>
- <string name="disable_tether_notification_title" msgid="7158047514545848391">"ਟੈਦਰਿੰਗ ਨੂੰ ਅਯੋਗ ਬਣਾਇਆ ਗਿਆ ਹੈ"</string>
- <string name="disable_tether_notification_message" msgid="98281313984014775">"ਵੇਰਵਿਆਂ ਲਈ ਆਪਣੇ ਪ੍ਰਸ਼ਾਸਕ ਨੂੰ ਸੰਪਰਕ ਕਰੋ"</string>
<string name="back_button_label" msgid="4078224038025043387">"ਪਿੱਛੇ"</string>
<string name="next_button_label" msgid="6040209156399907780">"ਅੱਗੇ"</string>
<string name="skip_button_label" msgid="3566599811326688389">"ਛੱਡੋ"</string>
diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml
index 7a86bd561546..4ff7cc419694 100644
--- a/core/res/res/values-pl/strings.xml
+++ b/core/res/res/values-pl/strings.xml
@@ -1469,10 +1469,6 @@
<string name="submit" msgid="862795280643405865">"Prześlij"</string>
<string name="car_mode_disable_notification_title" msgid="8450693275833142896">"Tryb samochodowy jest włączony"</string>
<string name="car_mode_disable_notification_message" msgid="8954550232288567515">"Kliknij, by zakończyć tryb samochodowy."</string>
- <string name="tethered_notification_title" msgid="2700523927485687353">"Aktywny tethering lub punkt dostępu"</string>
- <string name="tethered_notification_message" msgid="6228080755828019453">"Kliknij, by skonfigurować."</string>
- <string name="disable_tether_notification_title" msgid="7158047514545848391">"Tethering został wyłączony"</string>
- <string name="disable_tether_notification_message" msgid="98281313984014775">"Aby uzyskać szczegółowe informacje, skontaktuj się z administratorem"</string>
<string name="back_button_label" msgid="4078224038025043387">"Wróć"</string>
<string name="next_button_label" msgid="6040209156399907780">"Dalej"</string>
<string name="skip_button_label" msgid="3566599811326688389">"Pomiń"</string>
diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml
index 3f82a80453f1..1750d2a92de3 100644
--- a/core/res/res/values-pt-rBR/strings.xml
+++ b/core/res/res/values-pt-rBR/strings.xml
@@ -1429,10 +1429,6 @@
<string name="submit" msgid="862795280643405865">"Enviar"</string>
<string name="car_mode_disable_notification_title" msgid="8450693275833142896">"O app para carro está sendo usado"</string>
<string name="car_mode_disable_notification_message" msgid="8954550232288567515">"Toque para sair do app para carro."</string>
- <string name="tethered_notification_title" msgid="2700523927485687353">"Ponto de acesso ou tethering ativo"</string>
- <string name="tethered_notification_message" msgid="6228080755828019453">"Toque para configurar."</string>
- <string name="disable_tether_notification_title" msgid="7158047514545848391">"Tethering desativado"</string>
- <string name="disable_tether_notification_message" msgid="98281313984014775">"Fale com seu administrador para saber detalhes"</string>
<string name="back_button_label" msgid="4078224038025043387">"Voltar"</string>
<string name="next_button_label" msgid="6040209156399907780">"Avançar"</string>
<string name="skip_button_label" msgid="3566599811326688389">"Pular"</string>
diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml
index f67c96fa10ba..5c21c0dc0445 100644
--- a/core/res/res/values-pt-rPT/strings.xml
+++ b/core/res/res/values-pt-rPT/strings.xml
@@ -1429,10 +1429,6 @@
<string name="submit" msgid="862795280643405865">"Enviar"</string>
<string name="car_mode_disable_notification_title" msgid="8450693275833142896">"A aplicação de condução está em execução."</string>
<string name="car_mode_disable_notification_message" msgid="8954550232288567515">"Toque para sair da aplicação de condução."</string>
- <string name="tethered_notification_title" msgid="2700523927485687353">"Ligação ponto a ponto ou hotspot activos"</string>
- <string name="tethered_notification_message" msgid="6228080755828019453">"Toque para configurar."</string>
- <string name="disable_tether_notification_title" msgid="7158047514545848391">"A ligação (à Internet) via telemóvel está desativada."</string>
- <string name="disable_tether_notification_message" msgid="98281313984014775">"Contacte o gestor para obter detalhes."</string>
<string name="back_button_label" msgid="4078224038025043387">"Anterior"</string>
<string name="next_button_label" msgid="6040209156399907780">"Seguinte"</string>
<string name="skip_button_label" msgid="3566599811326688389">"Ignorar"</string>
diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml
index 3f82a80453f1..1750d2a92de3 100644
--- a/core/res/res/values-pt/strings.xml
+++ b/core/res/res/values-pt/strings.xml
@@ -1429,10 +1429,6 @@
<string name="submit" msgid="862795280643405865">"Enviar"</string>
<string name="car_mode_disable_notification_title" msgid="8450693275833142896">"O app para carro está sendo usado"</string>
<string name="car_mode_disable_notification_message" msgid="8954550232288567515">"Toque para sair do app para carro."</string>
- <string name="tethered_notification_title" msgid="2700523927485687353">"Ponto de acesso ou tethering ativo"</string>
- <string name="tethered_notification_message" msgid="6228080755828019453">"Toque para configurar."</string>
- <string name="disable_tether_notification_title" msgid="7158047514545848391">"Tethering desativado"</string>
- <string name="disable_tether_notification_message" msgid="98281313984014775">"Fale com seu administrador para saber detalhes"</string>
<string name="back_button_label" msgid="4078224038025043387">"Voltar"</string>
<string name="next_button_label" msgid="6040209156399907780">"Avançar"</string>
<string name="skip_button_label" msgid="3566599811326688389">"Pular"</string>
diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml
index 846b9829fa9c..397525a3faf3 100644
--- a/core/res/res/values-ro/strings.xml
+++ b/core/res/res/values-ro/strings.xml
@@ -1449,10 +1449,6 @@
<string name="submit" msgid="862795280643405865">"Trimiteți"</string>
<string name="car_mode_disable_notification_title" msgid="8450693275833142896">"Aplicația pentru condus rulează"</string>
<string name="car_mode_disable_notification_message" msgid="8954550232288567515">"Atingeți ca să ieșiți din aplicația pentru condus."</string>
- <string name="tethered_notification_title" msgid="2700523927485687353">"Tethering sau hotspot activ"</string>
- <string name="tethered_notification_message" msgid="6228080755828019453">"Atingeți ca să configurați."</string>
- <string name="disable_tether_notification_title" msgid="7158047514545848391">"Tetheringul este dezactivat"</string>
- <string name="disable_tether_notification_message" msgid="98281313984014775">"Contactați administratorul pentru detalii"</string>
<string name="back_button_label" msgid="4078224038025043387">"Înapoi"</string>
<string name="next_button_label" msgid="6040209156399907780">"Înainte"</string>
<string name="skip_button_label" msgid="3566599811326688389">"Omiteți"</string>
diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml
index 19fde9f45fb5..a7abbffdbe2d 100644
--- a/core/res/res/values-ru/strings.xml
+++ b/core/res/res/values-ru/strings.xml
@@ -1469,10 +1469,6 @@
<string name="submit" msgid="862795280643405865">"Отправить"</string>
<string name="car_mode_disable_notification_title" msgid="8450693275833142896">"Приложение для вождения включено"</string>
<string name="car_mode_disable_notification_message" msgid="8954550232288567515">"Нажмите, чтобы выйти из приложения для вождения."</string>
- <string name="tethered_notification_title" msgid="2700523927485687353">"Включен режим модема"</string>
- <string name="tethered_notification_message" msgid="6228080755828019453">"Нажмите, чтобы настроить."</string>
- <string name="disable_tether_notification_title" msgid="7158047514545848391">"Включить режим модема нельзя"</string>
- <string name="disable_tether_notification_message" msgid="98281313984014775">"Обратитесь к администратору, чтобы узнать подробности."</string>
<string name="back_button_label" msgid="4078224038025043387">"Назад"</string>
<string name="next_button_label" msgid="6040209156399907780">"Далее"</string>
<string name="skip_button_label" msgid="3566599811326688389">"Пропустить"</string>
diff --git a/core/res/res/values-si/strings.xml b/core/res/res/values-si/strings.xml
index 676b48f616f7..7d3f80d1331b 100644
--- a/core/res/res/values-si/strings.xml
+++ b/core/res/res/values-si/strings.xml
@@ -1431,10 +1431,6 @@
<string name="submit" msgid="862795280643405865">"යොමු කරන්න"</string>
<string name="car_mode_disable_notification_title" msgid="8450693275833142896">"රියදුරු යෙදුම ධාවනය වේ."</string>
<string name="car_mode_disable_notification_message" msgid="8954550232288567515">"රියදුරු යෙදුමෙන් පිටවීම සඳහා තට්ටු කරන්න."</string>
- <string name="tethered_notification_title" msgid="2700523927485687353">"ටෙදරින් හෝ හොට්ස්පොට් සක්‍රීයයි"</string>
- <string name="tethered_notification_message" msgid="6228080755828019453">"පිහිටුවීමට තට්ටු කරන්න."</string>
- <string name="disable_tether_notification_title" msgid="7158047514545848391">"ටෙදරින් අබල කර ඇත"</string>
- <string name="disable_tether_notification_message" msgid="98281313984014775">"විස්තර සඳහා ඔබගේ පරිපාලක අමතන්න"</string>
<string name="back_button_label" msgid="4078224038025043387">"ආපසු"</string>
<string name="next_button_label" msgid="6040209156399907780">"මීලඟ"</string>
<string name="skip_button_label" msgid="3566599811326688389">"මඟ හරින්න"</string>
diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml
index cde5466db748..3a81468c2d72 100644
--- a/core/res/res/values-sk/strings.xml
+++ b/core/res/res/values-sk/strings.xml
@@ -1469,10 +1469,6 @@
<string name="submit" msgid="862795280643405865">"Odoslať"</string>
<string name="car_mode_disable_notification_title" msgid="8450693275833142896">"Aplikácia na šoférovanie je spustená"</string>
<string name="car_mode_disable_notification_message" msgid="8954550232288567515">"Klepnutím ukončíte aplikáciu na šoférovanie"</string>
- <string name="tethered_notification_title" msgid="2700523927485687353">"Tethering alebo prístupový bod je aktívny"</string>
- <string name="tethered_notification_message" msgid="6228080755828019453">"Klepnutím prejdete na nastavenie."</string>
- <string name="disable_tether_notification_title" msgid="7158047514545848391">"Tethering je deaktivovaný"</string>
- <string name="disable_tether_notification_message" msgid="98281313984014775">"O podrobnosti požiadajte svojho správcu"</string>
<string name="back_button_label" msgid="4078224038025043387">"Späť"</string>
<string name="next_button_label" msgid="6040209156399907780">"Ďalej"</string>
<string name="skip_button_label" msgid="3566599811326688389">"Preskočiť"</string>
diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml
index 04940688c8fc..c28384c74236 100644
--- a/core/res/res/values-sl/strings.xml
+++ b/core/res/res/values-sl/strings.xml
@@ -1469,10 +1469,6 @@
<string name="submit" msgid="862795280643405865">"Pošlji"</string>
<string name="car_mode_disable_notification_title" msgid="8450693275833142896">"Aplikacija za vožnjo se izvaja"</string>
<string name="car_mode_disable_notification_message" msgid="8954550232288567515">"Dotaknite se, če želite zapreti aplikacijo za vožnjo."</string>
- <string name="tethered_notification_title" msgid="2700523927485687353">"Aktivna povezava z internetom ali dostopna točka sta aktivni"</string>
- <string name="tethered_notification_message" msgid="6228080755828019453">"Dotaknite se, če želite nastaviti."</string>
- <string name="disable_tether_notification_title" msgid="7158047514545848391">"Povezava z internetom prek mobilnega telefona je onemogočena"</string>
- <string name="disable_tether_notification_message" msgid="98281313984014775">"Za podrobnosti se obrnite na skrbnika"</string>
<string name="back_button_label" msgid="4078224038025043387">"Nazaj"</string>
<string name="next_button_label" msgid="6040209156399907780">"Naprej"</string>
<string name="skip_button_label" msgid="3566599811326688389">"Preskoči"</string>
diff --git a/core/res/res/values-sq/strings.xml b/core/res/res/values-sq/strings.xml
index 20e6ae513ada..39f73779a4ef 100644
--- a/core/res/res/values-sq/strings.xml
+++ b/core/res/res/values-sq/strings.xml
@@ -1429,10 +1429,6 @@
<string name="submit" msgid="862795280643405865">"Dërgo"</string>
<string name="car_mode_disable_notification_title" msgid="8450693275833142896">"Aplikacioni i drejtimit të makinës është në ekzekutim"</string>
<string name="car_mode_disable_notification_message" msgid="8954550232288567515">"Trokit për të dalë nga aplikacioni i drejtimit të makinës."</string>
- <string name="tethered_notification_title" msgid="2700523927485687353">"Lidhja e çiftimit ose ajo e qasjes në zona publike interneti është aktive"</string>
- <string name="tethered_notification_message" msgid="6228080755828019453">"Trokit për ta konfiguruar."</string>
- <string name="disable_tether_notification_title" msgid="7158047514545848391">"Lidhja e çiftimit është çaktivizuar"</string>
- <string name="disable_tether_notification_message" msgid="98281313984014775">"Kontakto me administratorin për detaje"</string>
<string name="back_button_label" msgid="4078224038025043387">"Prapa"</string>
<string name="next_button_label" msgid="6040209156399907780">"Përpara"</string>
<string name="skip_button_label" msgid="3566599811326688389">"Kapërce"</string>
diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml
index db53b23d9813..e93c852dfccc 100644
--- a/core/res/res/values-sr/strings.xml
+++ b/core/res/res/values-sr/strings.xml
@@ -1449,10 +1449,6 @@
<string name="submit" msgid="862795280643405865">"Пошаљи"</string>
<string name="car_mode_disable_notification_title" msgid="8450693275833142896">"Апликација за вожњу је покренута"</string>
<string name="car_mode_disable_notification_message" msgid="8954550232288567515">"Додирните да бисте изашли из апликације за вожњу."</string>
- <string name="tethered_notification_title" msgid="2700523927485687353">"Активно повезивање са интернетом преко мобилног уређаја или хотспот"</string>
- <string name="tethered_notification_message" msgid="6228080755828019453">"Додирните да бисте подесили."</string>
- <string name="disable_tether_notification_title" msgid="7158047514545848391">"Привезивање је онемогућено"</string>
- <string name="disable_tether_notification_message" msgid="98281313984014775">"Потражите детаље од администратора"</string>
<string name="back_button_label" msgid="4078224038025043387">"Назад"</string>
<string name="next_button_label" msgid="6040209156399907780">"Next"</string>
<string name="skip_button_label" msgid="3566599811326688389">"Прескочи"</string>
diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml
index 9e99aec5e9b1..cf0e0bbea662 100644
--- a/core/res/res/values-sv/strings.xml
+++ b/core/res/res/values-sv/strings.xml
@@ -1429,10 +1429,6 @@
<string name="submit" msgid="862795280643405865">"Skicka"</string>
<string name="car_mode_disable_notification_title" msgid="8450693275833142896">"Bilkörningsappen körs"</string>
<string name="car_mode_disable_notification_message" msgid="8954550232288567515">"Tryck här om du vill avsluta bilkörningsappen."</string>
- <string name="tethered_notification_title" msgid="2700523927485687353">"Internetdelning eller surfzon aktiverad"</string>
- <string name="tethered_notification_message" msgid="6228080755828019453">"Tryck om du vill konfigurera."</string>
- <string name="disable_tether_notification_title" msgid="7158047514545848391">"Internetdelning har inaktiverats"</string>
- <string name="disable_tether_notification_message" msgid="98281313984014775">"Kontakta administratören om du vill veta mer"</string>
<string name="back_button_label" msgid="4078224038025043387">"Tillbaka"</string>
<string name="next_button_label" msgid="6040209156399907780">"Nästa"</string>
<string name="skip_button_label" msgid="3566599811326688389">"Hoppa över"</string>
diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml
index d7b3555bf2af..f8cd19ce5517 100644
--- a/core/res/res/values-sw/strings.xml
+++ b/core/res/res/values-sw/strings.xml
@@ -1429,10 +1429,6 @@
<string name="submit" msgid="862795280643405865">"Wasilisha"</string>
<string name="car_mode_disable_notification_title" msgid="8450693275833142896">"Umewasha programu ya kuendesha gari"</string>
<string name="car_mode_disable_notification_message" msgid="8954550232288567515">"Gusa ili ufunge programu ya kuendesha gari."</string>
- <string name="tethered_notification_title" msgid="2700523927485687353">"Kushiriki au kusambaza intaneti kumewashwa"</string>
- <string name="tethered_notification_message" msgid="6228080755828019453">"Gusa ili uweke mipangilio."</string>
- <string name="disable_tether_notification_title" msgid="7158047514545848391">"Umezima kipengele cha kusambaza mtandao"</string>
- <string name="disable_tether_notification_message" msgid="98281313984014775">"Wasiliana na msimamizi wako ili upate maelezo zaidi"</string>
<string name="back_button_label" msgid="4078224038025043387">"Nyuma"</string>
<string name="next_button_label" msgid="6040209156399907780">"Endelea"</string>
<string name="skip_button_label" msgid="3566599811326688389">"Ruka"</string>
diff --git a/core/res/res/values-ta/strings.xml b/core/res/res/values-ta/strings.xml
index 569977c5013e..ac284d35607f 100644
--- a/core/res/res/values-ta/strings.xml
+++ b/core/res/res/values-ta/strings.xml
@@ -1429,10 +1429,6 @@
<string name="submit" msgid="862795280643405865">"சமர்ப்பி"</string>
<string name="car_mode_disable_notification_title" msgid="8450693275833142896">"\'வாகனம் ஓட்டும் பயன்முறை’ ஆனில் உள்ளது"</string>
<string name="car_mode_disable_notification_message" msgid="8954550232288567515">"வாகனம் ஓட்டும் பயன்முறையிலிருந்து வெளியேற, தட்டவும்."</string>
- <string name="tethered_notification_title" msgid="2700523927485687353">"டெதெரிங்/ஹாட்ஸ்பாட் இயங்குகிறது"</string>
- <string name="tethered_notification_message" msgid="6228080755828019453">"அமைக்க, தட்டவும்."</string>
- <string name="disable_tether_notification_title" msgid="7158047514545848391">"இணைப்பு முறை முடக்கப்பட்டுள்ளது"</string>
- <string name="disable_tether_notification_message" msgid="98281313984014775">"விவரங்களுக்கு, உங்கள் நிர்வாகியைத் தொடர்புகொள்ளவும்"</string>
<string name="back_button_label" msgid="4078224038025043387">"முந்தையது"</string>
<string name="next_button_label" msgid="6040209156399907780">"அடுத்து"</string>
<string name="skip_button_label" msgid="3566599811326688389">"தவிர்"</string>
diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml
index 9600172079b7..6641c413d36b 100644
--- a/core/res/res/values-te/strings.xml
+++ b/core/res/res/values-te/strings.xml
@@ -1429,10 +1429,6 @@
<string name="submit" msgid="862795280643405865">"సమర్పించు"</string>
<string name="car_mode_disable_notification_title" msgid="8450693275833142896">"డ్రైవింగ్ యాప్ అమలవుతోంది"</string>
<string name="car_mode_disable_notification_message" msgid="8954550232288567515">"డ్రైవింగ్ యాప్ నుండి నిష్క్రమించడం కోసం నొక్కండి."</string>
- <string name="tethered_notification_title" msgid="2700523927485687353">"టీథర్ చేయబడినది లేదా హాట్‌స్పాట్ సక్రియంగా ఉండేది"</string>
- <string name="tethered_notification_message" msgid="6228080755828019453">"సెటప్ చేయడానికి నొక్కండి."</string>
- <string name="disable_tether_notification_title" msgid="7158047514545848391">"టెథెరింగ్ నిలిపివేయబడింది"</string>
- <string name="disable_tether_notification_message" msgid="98281313984014775">"వివరాల కోసం మీ నిర్వాహకులను సంప్రదించండి"</string>
<string name="back_button_label" msgid="4078224038025043387">"వెనుకకు"</string>
<string name="next_button_label" msgid="6040209156399907780">"తర్వాత"</string>
<string name="skip_button_label" msgid="3566599811326688389">"దాటవేయి"</string>
diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml
index 4dd0d0fa54aa..bc4b79ebc5b1 100644
--- a/core/res/res/values-th/strings.xml
+++ b/core/res/res/values-th/strings.xml
@@ -1429,10 +1429,6 @@
<string name="submit" msgid="862795280643405865">"ส่ง"</string>
<string name="car_mode_disable_notification_title" msgid="8450693275833142896">"แอปสำหรับการขับขี่ทำงานอยู่"</string>
<string name="car_mode_disable_notification_message" msgid="8954550232288567515">"แตะเพื่อออกจากแอปสำหรับการขับขี่"</string>
- <string name="tethered_notification_title" msgid="2700523927485687353">"การปล่อยสัญญาณหรือฮอตสปอตทำงานอยู่"</string>
- <string name="tethered_notification_message" msgid="6228080755828019453">"แตะเพื่อตั้งค่า"</string>
- <string name="disable_tether_notification_title" msgid="7158047514545848391">"ปิดใช้การเชื่อมต่ออินเทอร์เน็ตผ่านมือถือแล้ว"</string>
- <string name="disable_tether_notification_message" msgid="98281313984014775">"ติดต่อผู้ดูแลระบบเพื่อขอรายละเอียด"</string>
<string name="back_button_label" msgid="4078224038025043387">"กลับ"</string>
<string name="next_button_label" msgid="6040209156399907780">"ถัดไป"</string>
<string name="skip_button_label" msgid="3566599811326688389">"ข้าม"</string>
diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml
index bde4027fd73b..b24e95a80dbf 100644
--- a/core/res/res/values-tl/strings.xml
+++ b/core/res/res/values-tl/strings.xml
@@ -1429,10 +1429,6 @@
<string name="submit" msgid="862795280643405865">"Isumite"</string>
<string name="car_mode_disable_notification_title" msgid="8450693275833142896">"Tumatakbo ang driving app"</string>
<string name="car_mode_disable_notification_message" msgid="8954550232288567515">"Mag-tap para lumabas sa app sa pagmamaneho."</string>
- <string name="tethered_notification_title" msgid="2700523927485687353">"Pagsasama o aktibong hotspot"</string>
- <string name="tethered_notification_message" msgid="6228080755828019453">"I-tap upang i-set up."</string>
- <string name="disable_tether_notification_title" msgid="7158047514545848391">"Naka-disable ang pag-tether"</string>
- <string name="disable_tether_notification_message" msgid="98281313984014775">"Makipag-ugnayan sa iyong admin para sa mga detalye"</string>
<string name="back_button_label" msgid="4078224038025043387">"Bumalik"</string>
<string name="next_button_label" msgid="6040209156399907780">"Susunod"</string>
<string name="skip_button_label" msgid="3566599811326688389">"Laktawan"</string>
diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml
index 0168ba0af607..326ace96f68d 100644
--- a/core/res/res/values-tr/strings.xml
+++ b/core/res/res/values-tr/strings.xml
@@ -1429,10 +1429,6 @@
<string name="submit" msgid="862795280643405865">"Gönder"</string>
<string name="car_mode_disable_notification_title" msgid="8450693275833142896">"Sürüş uygulaması çalışıyor"</string>
<string name="car_mode_disable_notification_message" msgid="8954550232288567515">"Sürüş uygulamasından çıkmak için dokunun."</string>
- <string name="tethered_notification_title" msgid="2700523927485687353">"Tethering veya hotspot etkin"</string>
- <string name="tethered_notification_message" msgid="6228080755828019453">"Ayarlamak için dokunun."</string>
- <string name="disable_tether_notification_title" msgid="7158047514545848391">"Tethering devre dışı bırakıldı"</string>
- <string name="disable_tether_notification_message" msgid="98281313984014775">"Ayrıntılı bilgi için yöneticinize başvurun"</string>
<string name="back_button_label" msgid="4078224038025043387">"Geri"</string>
<string name="next_button_label" msgid="6040209156399907780">"İleri"</string>
<string name="skip_button_label" msgid="3566599811326688389">"Atla"</string>
diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml
index 32042efd98be..8007f9e1d46a 100644
--- a/core/res/res/values-uk/strings.xml
+++ b/core/res/res/values-uk/strings.xml
@@ -1469,10 +1469,6 @@
<string name="submit" msgid="862795280643405865">"Надіслати"</string>
<string name="car_mode_disable_notification_title" msgid="8450693275833142896">"Працює додаток для автомобілів"</string>
<string name="car_mode_disable_notification_message" msgid="8954550232288567515">"Торкніться, щоб вийти з додатка для автомобілів."</string>
- <string name="tethered_notification_title" msgid="2700523927485687353">"Прив\'язка чи точка дост. активна"</string>
- <string name="tethered_notification_message" msgid="6228080755828019453">"Торкніться, щоб налаштувати."</string>
- <string name="disable_tether_notification_title" msgid="7158047514545848391">"Використання телефона в режимі модема вимкнено"</string>
- <string name="disable_tether_notification_message" msgid="98281313984014775">"Щоб дізнатися більше, зв’яжіться з адміністратором"</string>
<string name="back_button_label" msgid="4078224038025043387">"Назад"</string>
<string name="next_button_label" msgid="6040209156399907780">"Далі"</string>
<string name="skip_button_label" msgid="3566599811326688389">"Пропустити"</string>
diff --git a/core/res/res/values-ur/strings.xml b/core/res/res/values-ur/strings.xml
index 1dd8911fa4b3..312aed7dec0f 100644
--- a/core/res/res/values-ur/strings.xml
+++ b/core/res/res/values-ur/strings.xml
@@ -1429,10 +1429,6 @@
<string name="submit" msgid="862795280643405865">"جمع کرائیں"</string>
<string name="car_mode_disable_notification_title" msgid="8450693275833142896">"ڈرائیونگ ایپ چل رہی ہے"</string>
<string name="car_mode_disable_notification_message" msgid="8954550232288567515">"ڈرائیونگ ایپ سے باہر نکلنے کے لئے تھپتھپائيں۔"</string>
- <string name="tethered_notification_title" msgid="2700523927485687353">"ٹیدرنگ یا ہاٹ اسپاٹ فعال"</string>
- <string name="tethered_notification_message" msgid="6228080755828019453">"سیٹ اپ کرنے کیلئے تھپتھپائیں۔"</string>
- <string name="disable_tether_notification_title" msgid="7158047514545848391">"ٹیدرنگ غیر فعال ہے"</string>
- <string name="disable_tether_notification_message" msgid="98281313984014775">"تفصیلات کے لئے اپنے منتظم سے رابطہ کریں"</string>
<string name="back_button_label" msgid="4078224038025043387">"واپس جائیں"</string>
<string name="next_button_label" msgid="6040209156399907780">"اگلا"</string>
<string name="skip_button_label" msgid="3566599811326688389">"نظر انداز کریں"</string>
diff --git a/core/res/res/values-uz/strings.xml b/core/res/res/values-uz/strings.xml
index 4b7847d11de9..c7987d1b3410 100644
--- a/core/res/res/values-uz/strings.xml
+++ b/core/res/res/values-uz/strings.xml
@@ -1429,10 +1429,6 @@
<string name="submit" msgid="862795280643405865">"Yuborish"</string>
<string name="car_mode_disable_notification_title" msgid="8450693275833142896">"Avtomobil ilovasi ishlayapti"</string>
<string name="car_mode_disable_notification_message" msgid="8954550232288567515">"Avtomobil ilovasidan chiqish uchun bosing"</string>
- <string name="tethered_notification_title" msgid="2700523927485687353">"Modem rejimi yoniq"</string>
- <string name="tethered_notification_message" msgid="6228080755828019453">"Sozlash uchun bosing."</string>
- <string name="disable_tether_notification_title" msgid="7158047514545848391">"Modem rejimi faolsizlantirildi"</string>
- <string name="disable_tether_notification_message" msgid="98281313984014775">"Tafsilotlari uchun administratoringizga murojaat qiling"</string>
<string name="back_button_label" msgid="4078224038025043387">"Orqaga"</string>
<string name="next_button_label" msgid="6040209156399907780">"Keyingisi"</string>
<string name="skip_button_label" msgid="3566599811326688389">"Tashlab o‘tish"</string>
diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml
index 971cf34fd351..13c75f681a20 100644
--- a/core/res/res/values-vi/strings.xml
+++ b/core/res/res/values-vi/strings.xml
@@ -1429,10 +1429,6 @@
<string name="submit" msgid="862795280643405865">"Gửi"</string>
<string name="car_mode_disable_notification_title" msgid="8450693275833142896">"Ứng dụng lái xe đang chạy"</string>
<string name="car_mode_disable_notification_message" msgid="8954550232288567515">"Nhấn để thoát khỏi ứng dụng lái xe."</string>
- <string name="tethered_notification_title" msgid="2700523927485687353">"Chức năng điểm truy cập Internet hoặc điểm phát sóng đang hoạt động"</string>
- <string name="tethered_notification_message" msgid="6228080755828019453">"Nhấn để thiết lập."</string>
- <string name="disable_tether_notification_title" msgid="7158047514545848391">"Đã tắt tính năng chia sẻ kết nối"</string>
- <string name="disable_tether_notification_message" msgid="98281313984014775">"Hãy liên hệ với quản trị viên của bạn để biết chi tiết"</string>
<string name="back_button_label" msgid="4078224038025043387">"Quay lại"</string>
<string name="next_button_label" msgid="6040209156399907780">"Tiếp theo"</string>
<string name="skip_button_label" msgid="3566599811326688389">"Bỏ qua"</string>
diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml
index d7dd8b19089b..1df2a40c53ef 100644
--- a/core/res/res/values-zh-rCN/strings.xml
+++ b/core/res/res/values-zh-rCN/strings.xml
@@ -1429,10 +1429,6 @@
<string name="submit" msgid="862795280643405865">"提交"</string>
<string name="car_mode_disable_notification_title" msgid="8450693275833142896">"驾驶应用正在运行"</string>
<string name="car_mode_disable_notification_message" msgid="8954550232288567515">"点按即可退出驾驶应用。"</string>
- <string name="tethered_notification_title" msgid="2700523927485687353">"网络共享或热点已启用"</string>
- <string name="tethered_notification_message" msgid="6228080755828019453">"点按即可进行设置。"</string>
- <string name="disable_tether_notification_title" msgid="7158047514545848391">"网络共享已停用"</string>
- <string name="disable_tether_notification_message" msgid="98281313984014775">"请与您的管理员联系以了解详情"</string>
<string name="back_button_label" msgid="4078224038025043387">"上一步"</string>
<string name="next_button_label" msgid="6040209156399907780">"下一步"</string>
<string name="skip_button_label" msgid="3566599811326688389">"跳过"</string>
diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml
index 1a3784419393..d4d1f7c0d2b3 100644
--- a/core/res/res/values-zh-rHK/strings.xml
+++ b/core/res/res/values-zh-rHK/strings.xml
@@ -1429,10 +1429,6 @@
<string name="submit" msgid="862795280643405865">"提交"</string>
<string name="car_mode_disable_notification_title" msgid="8450693275833142896">"駕駛應用程式執行中"</string>
<string name="car_mode_disable_notification_message" msgid="8954550232288567515">"輕按即可退出駕駛應用程式。"</string>
- <string name="tethered_notification_title" msgid="2700523927485687353">"已啟用網絡共享或熱點"</string>
- <string name="tethered_notification_message" msgid="6228080755828019453">"輕按即可設定。"</string>
- <string name="disable_tether_notification_title" msgid="7158047514545848391">"網絡共享已停用"</string>
- <string name="disable_tether_notification_message" msgid="98281313984014775">"請聯絡您的管理員以瞭解詳情"</string>
<string name="back_button_label" msgid="4078224038025043387">"返回"</string>
<string name="next_button_label" msgid="6040209156399907780">"繼續"</string>
<string name="skip_button_label" msgid="3566599811326688389">"略過"</string>
diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml
index 5e655ac1faef..9997b68198d1 100644
--- a/core/res/res/values-zh-rTW/strings.xml
+++ b/core/res/res/values-zh-rTW/strings.xml
@@ -1429,10 +1429,6 @@
<string name="submit" msgid="862795280643405865">"提交"</string>
<string name="car_mode_disable_notification_title" msgid="8450693275833142896">"行車應用程式執行中"</string>
<string name="car_mode_disable_notification_message" msgid="8954550232288567515">"輕觸即可結束行車應用程式。"</string>
- <string name="tethered_notification_title" msgid="2700523927485687353">"網路共用或無線基地台已啟用"</string>
- <string name="tethered_notification_message" msgid="6228080755828019453">"輕觸即可進行設定。"</string>
- <string name="disable_tether_notification_title" msgid="7158047514545848391">"數據連線已停用"</string>
- <string name="disable_tether_notification_message" msgid="98281313984014775">"詳情請洽你的管理員"</string>
<string name="back_button_label" msgid="4078224038025043387">"返回"</string>
<string name="next_button_label" msgid="6040209156399907780">"繼續"</string>
<string name="skip_button_label" msgid="3566599811326688389">"略過"</string>
diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml
index 5f8d61ebc271..5838a93890cf 100644
--- a/core/res/res/values-zu/strings.xml
+++ b/core/res/res/values-zu/strings.xml
@@ -1429,10 +1429,6 @@
<string name="submit" msgid="862795280643405865">"Hambisa"</string>
<string name="car_mode_disable_notification_title" msgid="8450693275833142896">"Uhlelo lokusebenza lokushayela luyasebenza"</string>
<string name="car_mode_disable_notification_message" msgid="8954550232288567515">"Thepha ukuze uphume kuhlelo lokusebenza lokushayela."</string>
- <string name="tethered_notification_title" msgid="2700523927485687353">"Ukusebenzisa njengemodemu noma i-hotspot ephathekayo kuvuliwe"</string>
- <string name="tethered_notification_message" msgid="6228080755828019453">"Thepha ukuze usethe."</string>
- <string name="disable_tether_notification_title" msgid="7158047514545848391">"Ukusebenzisa ifoni njengemodemu kukhutshaziwe"</string>
- <string name="disable_tether_notification_message" msgid="98281313984014775">"Xhumana nomphathi wakho ukuze uthole imininingwane"</string>
<string name="back_button_label" msgid="4078224038025043387">"Emuva"</string>
<string name="next_button_label" msgid="6040209156399907780">"Okulandelayo"</string>
<string name="skip_button_label" msgid="3566599811326688389">"Yeqa"</string>
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index 7310dafe3ecc..dcf73792e041 100644
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -3838,18 +3838,6 @@
<string name="car_mode_disable_notification_title">Driving app is running</string>
<string name="car_mode_disable_notification_message">Tap to exit driving app.</string>
- <!-- Strings for tethered notification -->
- <!-- Shown when the device is tethered -->
- <string name="tethered_notification_title">Tethering or hotspot active</string>
- <string name="tethered_notification_message">Tap to set up.</string>
-
- <!-- Strings for tether disabling notification -->
- <!-- This notification is shown when tethering has been disabled on a user's device.
- The device is managed by the user's employer. Tethering can't be turned on unless the
- IT administrator allows it. The noun "admin" is another reference for "IT administrator." -->
- <string name="disable_tether_notification_title">Tethering is disabled</string>
- <string name="disable_tether_notification_message">Contact your admin for details</string>
-
<!-- Strings for possible PreferenceActivity Back/Next buttons -->
<string name="back_button_label">Back</string>
<string name="next_button_label">Next</string>
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index 130b31f092e0..d15d4d68239f 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -1893,9 +1893,6 @@
<java-symbol type="drawable" name="stat_sys_battery_charge" />
<java-symbol type="drawable" name="stat_sys_battery_unknown" />
<java-symbol type="drawable" name="stat_sys_data_usb" />
- <java-symbol type="drawable" name="stat_sys_tether_bluetooth" />
- <java-symbol type="drawable" name="stat_sys_tether_general" />
- <java-symbol type="drawable" name="stat_sys_tether_usb" />
<java-symbol type="drawable" name="stat_sys_throttled" />
<java-symbol type="drawable" name="vpn_connected" />
<java-symbol type="drawable" name="vpn_disconnected" />
@@ -2071,10 +2068,6 @@
<java-symbol type="string" name="select_keyboard_layout_notification_message" />
<java-symbol type="string" name="smv_application" />
<java-symbol type="string" name="smv_process" />
- <java-symbol type="string" name="tethered_notification_message" />
- <java-symbol type="string" name="tethered_notification_title" />
- <java-symbol type="string" name="disable_tether_notification_message" />
- <java-symbol type="string" name="disable_tether_notification_title" />
<java-symbol type="string" name="adb_debugging_notification_channel_tv" />
<java-symbol type="string" name="usb_accessory_notification_title" />
<java-symbol type="string" name="usb_mtp_notification_title" />
diff --git a/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/AccessPointTest.java b/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/AccessPointTest.java
index 7d06e6cc5735..7b1c3825fcc6 100644
--- a/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/AccessPointTest.java
+++ b/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/AccessPointTest.java
@@ -120,7 +120,7 @@ public class AccessPointTest {
private OsuProvider createOsuProvider() {
Map<String, String> friendlyNames = new HashMap<>();
friendlyNames.put("en", OSU_FRIENDLY_NAME);
- return new OsuProvider((WifiSsid) null, friendlyNames, null, null, null, null, null);
+ return new OsuProvider((WifiSsid) null, friendlyNames, null, null, null, null);
}
@Before
diff --git a/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/WifiTrackerTest.java b/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/WifiTrackerTest.java
index 94fbc542c3e4..81cf118031bf 100644
--- a/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/WifiTrackerTest.java
+++ b/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/WifiTrackerTest.java
@@ -336,7 +336,7 @@ public class WifiTrackerTest {
private static OsuProvider buildOsuProvider(String friendlyName) {
Map<String, String> friendlyNames = new HashMap<>();
friendlyNames.put("en", friendlyName);
- return new OsuProvider((WifiSsid) null, friendlyNames, null, null, null, null, null);
+ return new OsuProvider((WifiSsid) null, friendlyNames, null, null, null, null);
}
private WifiTracker createTrackerWithImmediateBroadcastsAndInjectInitialScanResults(
diff --git a/packages/SettingsProvider/src/android/provider/settings/validators/AccessibilityShortcutTargetListValidator.java b/packages/SettingsProvider/src/android/provider/settings/validators/AccessibilityShortcutTargetListValidator.java
new file mode 100644
index 000000000000..5f3d7f16ec1d
--- /dev/null
+++ b/packages/SettingsProvider/src/android/provider/settings/validators/AccessibilityShortcutTargetListValidator.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2019 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.provider.settings.validators;
+
+import static android.provider.settings.validators.SettingsValidators.COMPONENT_NAME_VALIDATOR;
+import static android.provider.settings.validators.SettingsValidators.PACKAGE_NAME_VALIDATOR;
+
+import android.text.TextUtils;
+
+/**
+ * Ensure a restored value is a string in the format the accessibility shortcut system handles
+ *
+ * @hide
+ */
+public final class AccessibilityShortcutTargetListValidator extends ListValidator {
+ public AccessibilityShortcutTargetListValidator() {
+ super(":");
+ }
+
+ @Override
+ protected boolean isEntryValid(String entry) {
+ return !TextUtils.isEmpty(entry);
+ }
+
+ @Override
+ protected boolean isItemValid(String item) {
+ if (TextUtils.isEmpty(item)) {
+ return false;
+ }
+ return (COMPONENT_NAME_VALIDATOR.validate(item) || PACKAGE_NAME_VALIDATOR.validate(item));
+ }
+}
diff --git a/packages/SettingsProvider/src/android/provider/settings/validators/ListValidator.java b/packages/SettingsProvider/src/android/provider/settings/validators/ListValidator.java
index a6001d2e10c1..104fa11a678d 100644
--- a/packages/SettingsProvider/src/android/provider/settings/validators/ListValidator.java
+++ b/packages/SettingsProvider/src/android/provider/settings/validators/ListValidator.java
@@ -35,7 +35,7 @@ abstract class ListValidator implements Validator {
if (!isEntryValid(value)) {
return false;
}
- String[] items = value.split(",");
+ String[] items = value.split(mListSplitRegex);
for (String item : items) {
if (!isItemValid(item)) {
return false;
diff --git a/packages/SettingsProvider/src/android/provider/settings/validators/SecureSettingsValidators.java b/packages/SettingsProvider/src/android/provider/settings/validators/SecureSettingsValidators.java
index 9460d27f7843..090af9837db8 100644
--- a/packages/SettingsProvider/src/android/provider/settings/validators/SecureSettingsValidators.java
+++ b/packages/SettingsProvider/src/android/provider/settings/validators/SecureSettingsValidators.java
@@ -16,6 +16,7 @@
package android.provider.settings.validators;
+import static android.provider.settings.validators.SettingsValidators.ACCESSIBILITY_SHORTCUT_TARGET_LIST_VALIDATOR;
import static android.provider.settings.validators.SettingsValidators.ANY_INTEGER_VALIDATOR;
import static android.provider.settings.validators.SettingsValidators.BOOLEAN_VALIDATOR;
import static android.provider.settings.validators.SettingsValidators.COLON_SEPARATED_COMPONENT_LIST_VALIDATOR;
@@ -71,10 +72,13 @@ public class SecureSettingsValidators {
VALIDATORS.put(Secure.TOUCH_EXPLORATION_ENABLED, BOOLEAN_VALIDATOR);
VALIDATORS.put(Secure.ACCESSIBILITY_ENABLED, BOOLEAN_VALIDATOR);
VALIDATORS.put(
- Secure.ACCESSIBILITY_SHORTCUT_TARGET_SERVICE, NULLABLE_COMPONENT_NAME_VALIDATOR);
+ Secure.ACCESSIBILITY_SHORTCUT_TARGET_SERVICE,
+ ACCESSIBILITY_SHORTCUT_TARGET_LIST_VALIDATOR);
// technically either ComponentName or class name, but there's proper value
// validation at callsites, so allow any non-null string
- VALIDATORS.put(Secure.ACCESSIBILITY_BUTTON_TARGET_COMPONENT, value -> value != null);
+ VALIDATORS.put(
+ Secure.ACCESSIBILITY_BUTTON_TARGET_COMPONENT,
+ ACCESSIBILITY_SHORTCUT_TARGET_LIST_VALIDATOR);
VALIDATORS.put(Secure.ACCESSIBILITY_SHORTCUT_DIALOG_SHOWN, BOOLEAN_VALIDATOR);
VALIDATORS.put(Secure.ACCESSIBILITY_SHORTCUT_ENABLED, BOOLEAN_VALIDATOR);
VALIDATORS.put(Secure.ACCESSIBILITY_SHORTCUT_ON_LOCK_SCREEN, BOOLEAN_VALIDATOR);
diff --git a/packages/SettingsProvider/src/android/provider/settings/validators/SettingsValidators.java b/packages/SettingsProvider/src/android/provider/settings/validators/SettingsValidators.java
index 224042ca755d..71c7544a3a4c 100644
--- a/packages/SettingsProvider/src/android/provider/settings/validators/SettingsValidators.java
+++ b/packages/SettingsProvider/src/android/provider/settings/validators/SettingsValidators.java
@@ -204,4 +204,7 @@ public class SettingsValidators {
new InclusiveIntegerRangeValidator(0, 100);
static final Validator VIBRATION_INTENSITY_VALIDATOR = new InclusiveIntegerRangeValidator(0, 3);
+
+ static final Validator ACCESSIBILITY_SHORTCUT_TARGET_LIST_VALIDATOR =
+ new AccessibilityShortcutTargetListValidator();
}
diff --git a/packages/SettingsProvider/test/src/android/provider/settings/validators/SettingsValidatorsTest.java b/packages/SettingsProvider/test/src/android/provider/settings/validators/SettingsValidatorsTest.java
index a3b08359860c..bb9e6f6fe885 100644
--- a/packages/SettingsProvider/test/src/android/provider/settings/validators/SettingsValidatorsTest.java
+++ b/packages/SettingsProvider/test/src/android/provider/settings/validators/SettingsValidatorsTest.java
@@ -297,6 +297,18 @@ public class SettingsValidatorsTest {
}
@Test
+ public void testAccessibilityShortcutTargetValidator() {
+ assertTrue(SettingsValidators.ACCESSIBILITY_SHORTCUT_TARGET_LIST_VALIDATOR.validate(
+ "com.google.android/.AccessibilityShortcutTarget"));
+ assertTrue(SettingsValidators.ACCESSIBILITY_SHORTCUT_TARGET_LIST_VALIDATOR.validate(
+ "com.google.android"));
+ assertTrue(SettingsValidators.ACCESSIBILITY_SHORTCUT_TARGET_LIST_VALIDATOR.validate(
+ "com.google.android/.AccessibilityShortcutTarget:com.google.android"));
+ assertFalse(SettingsValidators.ACCESSIBILITY_SHORTCUT_TARGET_LIST_VALIDATOR.validate(
+ "com.google.android/.AccessibilityShortcutTarget:com.google.@android"));
+ }
+
+ @Test
public void ensureAllBackedUpGlobalSettingsHaveValidators() {
String offenders = getOffenders(concat(GlobalSettings.SETTINGS_TO_BACKUP,
Settings.Global.LEGACY_RESTORE_SETTINGS), GlobalSettingsValidators.VALIDATORS);
diff --git a/core/res/res/drawable-hdpi/stat_sys_tether_bluetooth.png b/packages/Tethering/res/drawable-hdpi/stat_sys_tether_bluetooth.png
index 9451174d65d7..9451174d65d7 100644
--- a/core/res/res/drawable-hdpi/stat_sys_tether_bluetooth.png
+++ b/packages/Tethering/res/drawable-hdpi/stat_sys_tether_bluetooth.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/stat_sys_tether_general.png b/packages/Tethering/res/drawable-hdpi/stat_sys_tether_general.png
index 79d5756ae38e..79d5756ae38e 100644
--- a/core/res/res/drawable-hdpi/stat_sys_tether_general.png
+++ b/packages/Tethering/res/drawable-hdpi/stat_sys_tether_general.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/stat_sys_tether_usb.png b/packages/Tethering/res/drawable-hdpi/stat_sys_tether_usb.png
index cae1bd1b2574..cae1bd1b2574 100644
--- a/core/res/res/drawable-hdpi/stat_sys_tether_usb.png
+++ b/packages/Tethering/res/drawable-hdpi/stat_sys_tether_usb.png
Binary files differ
diff --git a/core/res/res/drawable-ldpi/stat_sys_tether_bluetooth.png b/packages/Tethering/res/drawable-ldpi/stat_sys_tether_bluetooth.png
index ffe8e8c98232..ffe8e8c98232 100644
--- a/core/res/res/drawable-ldpi/stat_sys_tether_bluetooth.png
+++ b/packages/Tethering/res/drawable-ldpi/stat_sys_tether_bluetooth.png
Binary files differ
diff --git a/core/res/res/drawable-ldpi/stat_sys_tether_general.png b/packages/Tethering/res/drawable-ldpi/stat_sys_tether_general.png
index ca20f7352090..ca20f7352090 100644
--- a/core/res/res/drawable-ldpi/stat_sys_tether_general.png
+++ b/packages/Tethering/res/drawable-ldpi/stat_sys_tether_general.png
Binary files differ
diff --git a/core/res/res/drawable-ldpi/stat_sys_tether_usb.png b/packages/Tethering/res/drawable-ldpi/stat_sys_tether_usb.png
index 65e907565ec1..65e907565ec1 100644
--- a/core/res/res/drawable-ldpi/stat_sys_tether_usb.png
+++ b/packages/Tethering/res/drawable-ldpi/stat_sys_tether_usb.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/stat_sys_tether_bluetooth.png b/packages/Tethering/res/drawable-mdpi/stat_sys_tether_bluetooth.png
index f42dae0fdcb9..f42dae0fdcb9 100644
--- a/core/res/res/drawable-mdpi/stat_sys_tether_bluetooth.png
+++ b/packages/Tethering/res/drawable-mdpi/stat_sys_tether_bluetooth.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/stat_sys_tether_general.png b/packages/Tethering/res/drawable-mdpi/stat_sys_tether_general.png
index 065516185ad4..065516185ad4 100644
--- a/core/res/res/drawable-mdpi/stat_sys_tether_general.png
+++ b/packages/Tethering/res/drawable-mdpi/stat_sys_tether_general.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/stat_sys_tether_usb.png b/packages/Tethering/res/drawable-mdpi/stat_sys_tether_usb.png
index 2e2b8ca2e9cb..2e2b8ca2e9cb 100644
--- a/core/res/res/drawable-mdpi/stat_sys_tether_usb.png
+++ b/packages/Tethering/res/drawable-mdpi/stat_sys_tether_usb.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/stat_sys_tether_bluetooth.png b/packages/Tethering/res/drawable-xhdpi/stat_sys_tether_bluetooth.png
index 3f57d1c76ccb..3f57d1c76ccb 100644
--- a/core/res/res/drawable-xhdpi/stat_sys_tether_bluetooth.png
+++ b/packages/Tethering/res/drawable-xhdpi/stat_sys_tether_bluetooth.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/stat_sys_tether_general.png b/packages/Tethering/res/drawable-xhdpi/stat_sys_tether_general.png
index 34b0cb36736a..34b0cb36736a 100644
--- a/core/res/res/drawable-xhdpi/stat_sys_tether_general.png
+++ b/packages/Tethering/res/drawable-xhdpi/stat_sys_tether_general.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/stat_sys_tether_usb.png b/packages/Tethering/res/drawable-xhdpi/stat_sys_tether_usb.png
index 36afe485b5bb..36afe485b5bb 100644
--- a/core/res/res/drawable-xhdpi/stat_sys_tether_usb.png
+++ b/packages/Tethering/res/drawable-xhdpi/stat_sys_tether_usb.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/stat_sys_tether_bluetooth.png b/packages/Tethering/res/drawable-xxhdpi/stat_sys_tether_bluetooth.png
index 25acfbb01ba4..25acfbb01ba4 100644
--- a/core/res/res/drawable-xxhdpi/stat_sys_tether_bluetooth.png
+++ b/packages/Tethering/res/drawable-xxhdpi/stat_sys_tether_bluetooth.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/stat_sys_tether_general.png b/packages/Tethering/res/drawable-xxhdpi/stat_sys_tether_general.png
index 5c656012e615..5c656012e615 100644
--- a/core/res/res/drawable-xxhdpi/stat_sys_tether_general.png
+++ b/packages/Tethering/res/drawable-xxhdpi/stat_sys_tether_general.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/stat_sys_tether_usb.png b/packages/Tethering/res/drawable-xxhdpi/stat_sys_tether_usb.png
index 28b4b5438e55..28b4b5438e55 100644
--- a/core/res/res/drawable-xxhdpi/stat_sys_tether_usb.png
+++ b/packages/Tethering/res/drawable-xxhdpi/stat_sys_tether_usb.png
Binary files differ
diff --git a/packages/Tethering/res/values-af/strings.xml b/packages/Tethering/res/values-af/strings.xml
new file mode 100644
index 000000000000..1258805378ea
--- /dev/null
+++ b/packages/Tethering/res/values-af/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="tethered_notification_title" msgid="3146694234398202601">"Verbinding of Wi-Fi-warmkol aktief"</string>
+ <string name="tethered_notification_message" msgid="2113628520792055377">"Tik om op te stel."</string>
+ <string name="disable_tether_notification_title" msgid="7526977944111313195">"Verbinding is gedeaktiveer"</string>
+ <string name="disable_tether_notification_message" msgid="2913366428516852495">"Kontak jou administrateur vir besonderhede"</string>
+</resources>
diff --git a/packages/Tethering/res/values-am/strings.xml b/packages/Tethering/res/values-am/strings.xml
new file mode 100644
index 000000000000..9c36192257c0
--- /dev/null
+++ b/packages/Tethering/res/values-am/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="tethered_notification_title" msgid="3146694234398202601">"መሰካት ወይም ገባሪ ድረስ ነጥብ"</string>
+ <string name="tethered_notification_message" msgid="2113628520792055377">"ለማዋቀር መታ ያድርጉ።"</string>
+ <string name="disable_tether_notification_title" msgid="7526977944111313195">"እንደ ሞደም መሰካት ተሰናክሏል"</string>
+ <string name="disable_tether_notification_message" msgid="2913366428516852495">"ለዝርዝሮች የእርስዎን አስተዳዳሪ ያነጋግሩ"</string>
+</resources>
diff --git a/packages/Tethering/res/values-ar/strings.xml b/packages/Tethering/res/values-ar/strings.xml
new file mode 100644
index 000000000000..9f84ce4090c6
--- /dev/null
+++ b/packages/Tethering/res/values-ar/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="tethered_notification_title" msgid="3146694234398202601">"النطاق أو نقطة الاتصال نشطة"</string>
+ <string name="tethered_notification_message" msgid="2113628520792055377">"انقر للإعداد."</string>
+ <string name="disable_tether_notification_title" msgid="7526977944111313195">"تم إيقاف التوصيل"</string>
+ <string name="disable_tether_notification_message" msgid="2913366428516852495">"اتصل بالمشرف للحصول على التفاصيل"</string>
+</resources>
diff --git a/packages/Tethering/res/values-as/strings.xml b/packages/Tethering/res/values-as/strings.xml
new file mode 100644
index 000000000000..8855822e7c8b
--- /dev/null
+++ b/packages/Tethering/res/values-as/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="tethered_notification_title" msgid="3146694234398202601">"টেডাৰিং বা হটস্প\'ট সক্ৰিয় অৱস্থাত আছে"</string>
+ <string name="tethered_notification_message" msgid="2113628520792055377">"ছেট আপ কৰিবলৈ টিপক।"</string>
+ <string name="disable_tether_notification_title" msgid="7526977944111313195">"টেডাৰিং অক্ষম কৰি থোৱা হৈছে"</string>
+ <string name="disable_tether_notification_message" msgid="2913366428516852495">"সবিশেষ জানিবলৈ আপোনাৰ প্ৰশাসকৰ সৈতে যোগাযোগ কৰক"</string>
+</resources>
diff --git a/packages/Tethering/res/values-az/strings.xml b/packages/Tethering/res/values-az/strings.xml
new file mode 100644
index 000000000000..eba50eb636c1
--- /dev/null
+++ b/packages/Tethering/res/values-az/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="tethered_notification_title" msgid="3146694234398202601">"Tezerinq və ya hotspot aktivdir"</string>
+ <string name="tethered_notification_message" msgid="2113628520792055377">"Quraşdırmaq üçün tıklayın."</string>
+ <string name="disable_tether_notification_title" msgid="7526977944111313195">"Birləşmə deaktivdir"</string>
+ <string name="disable_tether_notification_message" msgid="2913366428516852495">"Məlumat üçün adminlə əlaqə saxlayın"</string>
+</resources>
diff --git a/packages/Tethering/res/values-b+sr+Latn/strings.xml b/packages/Tethering/res/values-b+sr+Latn/strings.xml
new file mode 100644
index 000000000000..5b0e488ba5e6
--- /dev/null
+++ b/packages/Tethering/res/values-b+sr+Latn/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="tethered_notification_title" msgid="3146694234398202601">"Aktivno povezivanje sa internetom preko mobilnog uređaja ili hotspot"</string>
+ <string name="tethered_notification_message" msgid="2113628520792055377">"Dodirnite da biste podesili."</string>
+ <string name="disable_tether_notification_title" msgid="7526977944111313195">"Privezivanje je onemogućeno"</string>
+ <string name="disable_tether_notification_message" msgid="2913366428516852495">"Potražite detalje od administratora"</string>
+</resources>
diff --git a/packages/Tethering/res/values-be/strings.xml b/packages/Tethering/res/values-be/strings.xml
new file mode 100644
index 000000000000..5966c7155ecd
--- /dev/null
+++ b/packages/Tethering/res/values-be/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="tethered_notification_title" msgid="3146694234398202601">"USB-мадэм або хот-спот Wi-Fi актыўныя"</string>
+ <string name="tethered_notification_message" msgid="2113628520792055377">"Дакраніцеся, каб наладзіць."</string>
+ <string name="disable_tether_notification_title" msgid="7526977944111313195">"Рэжым мадэма адключаны"</string>
+ <string name="disable_tether_notification_message" msgid="2913366428516852495">"Звярніцеся да адміністратара па падрабязную інфармацыю"</string>
+</resources>
diff --git a/packages/Tethering/res/values-bg/strings.xml b/packages/Tethering/res/values-bg/strings.xml
new file mode 100644
index 000000000000..ed58d7311aca
--- /dev/null
+++ b/packages/Tethering/res/values-bg/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="tethered_notification_title" msgid="3146694234398202601">"Има активна споделена връзка или безжична точка за достъп"</string>
+ <string name="tethered_notification_message" msgid="2113628520792055377">"Докоснете, за да настроите."</string>
+ <string name="disable_tether_notification_title" msgid="7526977944111313195">"Функцията за тетъринг е деактивирана"</string>
+ <string name="disable_tether_notification_message" msgid="2913366428516852495">"Свържете се с администратора си за подробности"</string>
+</resources>
diff --git a/packages/Tethering/res/values-bn/strings.xml b/packages/Tethering/res/values-bn/strings.xml
new file mode 100644
index 000000000000..8d9880aa9aca
--- /dev/null
+++ b/packages/Tethering/res/values-bn/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="tethered_notification_title" msgid="3146694234398202601">"টিথারিং বা হটস্পট সক্রিয় আছে"</string>
+ <string name="tethered_notification_message" msgid="2113628520792055377">"সেট-আপ করার জন্য আলতো চাপুন৷"</string>
+ <string name="disable_tether_notification_title" msgid="7526977944111313195">"টিথারিং অক্ষম করা আছে"</string>
+ <string name="disable_tether_notification_message" msgid="2913366428516852495">"বিশদ বিবরণের জন্য প্রশাসকের সাথে যোগাযোগ করুন"</string>
+</resources>
diff --git a/packages/Tethering/res/values-bs/strings.xml b/packages/Tethering/res/values-bs/strings.xml
new file mode 100644
index 000000000000..2361b9dd382c
--- /dev/null
+++ b/packages/Tethering/res/values-bs/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="tethered_notification_title" msgid="3146694234398202601">"Uređaj dijeli vezu ili djeluje kao pristupna tačka"</string>
+ <string name="tethered_notification_message" msgid="2113628520792055377">"Dodirnite za postavke"</string>
+ <string name="disable_tether_notification_title" msgid="7526977944111313195">"Povezivanje putem mobitela je onemogućeno"</string>
+ <string name="disable_tether_notification_message" msgid="2913366428516852495">"Kontaktirajte svog administratora za dodatne detalje"</string>
+</resources>
diff --git a/packages/Tethering/res/values-ca/strings.xml b/packages/Tethering/res/values-ca/strings.xml
new file mode 100644
index 000000000000..6752b519e218
--- /dev/null
+++ b/packages/Tethering/res/values-ca/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="tethered_notification_title" msgid="3146694234398202601">"Compartició de xarxa o punt d\'accés Wi-Fi activat"</string>
+ <string name="tethered_notification_message" msgid="2113628520792055377">"Toca per configurar."</string>
+ <string name="disable_tether_notification_title" msgid="7526977944111313195">"La compartició de xarxa està desactivada"</string>
+ <string name="disable_tether_notification_message" msgid="2913366428516852495">"Contacta amb el teu administrador per obtenir més informació"</string>
+</resources>
diff --git a/packages/Tethering/res/values-cs/strings.xml b/packages/Tethering/res/values-cs/strings.xml
new file mode 100644
index 000000000000..5fdd53adf15c
--- /dev/null
+++ b/packages/Tethering/res/values-cs/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="tethered_notification_title" msgid="3146694234398202601">"Sdílené připojení nebo hotspot je aktivní."</string>
+ <string name="tethered_notification_message" msgid="2113628520792055377">"Klepnutím zahájíte nastavení."</string>
+ <string name="disable_tether_notification_title" msgid="7526977944111313195">"Tethering je zakázán"</string>
+ <string name="disable_tether_notification_message" msgid="2913366428516852495">"O podrobnosti požádejte administrátora"</string>
+</resources>
diff --git a/packages/Tethering/res/values-da/strings.xml b/packages/Tethering/res/values-da/strings.xml
new file mode 100644
index 000000000000..2775dfa551cb
--- /dev/null
+++ b/packages/Tethering/res/values-da/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="tethered_notification_title" msgid="3146694234398202601">"Netdeling eller hotspot er aktivt"</string>
+ <string name="tethered_notification_message" msgid="2113628520792055377">"Tryk for at konfigurere"</string>
+ <string name="disable_tether_notification_title" msgid="7526977944111313195">"Netdeling er deaktiveret"</string>
+ <string name="disable_tether_notification_message" msgid="2913366428516852495">"Kontakt din administrator for at få oplysninger"</string>
+</resources>
diff --git a/packages/Tethering/res/values-de/strings.xml b/packages/Tethering/res/values-de/strings.xml
new file mode 100644
index 000000000000..9046cd5e1144
--- /dev/null
+++ b/packages/Tethering/res/values-de/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="tethered_notification_title" msgid="3146694234398202601">"Tethering oder Hotspot aktiv"</string>
+ <string name="tethered_notification_message" msgid="2113628520792055377">"Zum Einrichten tippen."</string>
+ <string name="disable_tether_notification_title" msgid="7526977944111313195">"Tethering ist deaktiviert"</string>
+ <string name="disable_tether_notification_message" msgid="2913366428516852495">"Bitte wende dich für weitere Informationen an den Administrator"</string>
+</resources>
diff --git a/packages/Tethering/res/values-el/strings.xml b/packages/Tethering/res/values-el/strings.xml
new file mode 100644
index 000000000000..3b9f53733b8a
--- /dev/null
+++ b/packages/Tethering/res/values-el/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="tethered_notification_title" msgid="3146694234398202601">"Πρόσδεση ή σύνδεση σημείου πρόσβασης ενεργή"</string>
+ <string name="tethered_notification_message" msgid="2113628520792055377">"Πατήστε για ρύθμιση."</string>
+ <string name="disable_tether_notification_title" msgid="7526977944111313195">"Η σύνδεση είναι απενεργοποιημένη"</string>
+ <string name="disable_tether_notification_message" msgid="2913366428516852495">"Επικοινωνήστε με τον διαχειριστή σας για λεπτομέρειες"</string>
+</resources>
diff --git a/packages/Tethering/res/values-en-rAU/strings.xml b/packages/Tethering/res/values-en-rAU/strings.xml
new file mode 100644
index 000000000000..56b88a5fb3e1
--- /dev/null
+++ b/packages/Tethering/res/values-en-rAU/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="tethered_notification_title" msgid="3146694234398202601">"Tethering or hotspot active"</string>
+ <string name="tethered_notification_message" msgid="2113628520792055377">"Tap to set up."</string>
+ <string name="disable_tether_notification_title" msgid="7526977944111313195">"Tethering is disabled"</string>
+ <string name="disable_tether_notification_message" msgid="2913366428516852495">"Contact your admin for details"</string>
+</resources>
diff --git a/packages/Tethering/res/values-en-rCA/strings.xml b/packages/Tethering/res/values-en-rCA/strings.xml
new file mode 100644
index 000000000000..56b88a5fb3e1
--- /dev/null
+++ b/packages/Tethering/res/values-en-rCA/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="tethered_notification_title" msgid="3146694234398202601">"Tethering or hotspot active"</string>
+ <string name="tethered_notification_message" msgid="2113628520792055377">"Tap to set up."</string>
+ <string name="disable_tether_notification_title" msgid="7526977944111313195">"Tethering is disabled"</string>
+ <string name="disable_tether_notification_message" msgid="2913366428516852495">"Contact your admin for details"</string>
+</resources>
diff --git a/packages/Tethering/res/values-en-rGB/strings.xml b/packages/Tethering/res/values-en-rGB/strings.xml
new file mode 100644
index 000000000000..56b88a5fb3e1
--- /dev/null
+++ b/packages/Tethering/res/values-en-rGB/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="tethered_notification_title" msgid="3146694234398202601">"Tethering or hotspot active"</string>
+ <string name="tethered_notification_message" msgid="2113628520792055377">"Tap to set up."</string>
+ <string name="disable_tether_notification_title" msgid="7526977944111313195">"Tethering is disabled"</string>
+ <string name="disable_tether_notification_message" msgid="2913366428516852495">"Contact your admin for details"</string>
+</resources>
diff --git a/packages/Tethering/res/values-en-rIN/strings.xml b/packages/Tethering/res/values-en-rIN/strings.xml
new file mode 100644
index 000000000000..56b88a5fb3e1
--- /dev/null
+++ b/packages/Tethering/res/values-en-rIN/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="tethered_notification_title" msgid="3146694234398202601">"Tethering or hotspot active"</string>
+ <string name="tethered_notification_message" msgid="2113628520792055377">"Tap to set up."</string>
+ <string name="disable_tether_notification_title" msgid="7526977944111313195">"Tethering is disabled"</string>
+ <string name="disable_tether_notification_message" msgid="2913366428516852495">"Contact your admin for details"</string>
+</resources>
diff --git a/packages/Tethering/res/values-en-rXC/strings.xml b/packages/Tethering/res/values-en-rXC/strings.xml
new file mode 100644
index 000000000000..7f47fc89d2af
--- /dev/null
+++ b/packages/Tethering/res/values-en-rXC/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="tethered_notification_title" msgid="3146694234398202601">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‏‏‏‎‏‎‏‎‏‏‎‏‎‎‏‏‎‏‏‎‏‏‏‎‏‏‏‏‏‏‏‎‏‎‎‎‎‏‎‎‏‏‎‎‎‏‏‎‏‎‏‏‏‎‏‎‎‏‎Tethering or hotspot active‎‏‎‎‏‎"</string>
+ <string name="tethered_notification_message" msgid="2113628520792055377">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‎‏‎‏‎‏‎‏‎‏‎‎‎‏‏‏‎‏‏‏‏‏‎‎‎‎‏‏‏‏‎‎‎‎‏‏‏‏‎‎‎‏‏‏‎‏‏‏‏‎‎‏‎‏‎‎‎‏‎Tap to set up.‎‏‎‎‏‎"</string>
+ <string name="disable_tether_notification_title" msgid="7526977944111313195">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‎‎‎‏‏‏‎‏‎‏‎‎‏‏‎‎‏‎‏‎‎‎‏‏‏‏‎‏‏‏‏‏‏‎‏‏‏‏‎‏‎‎‎‏‏‏‎‎‎‏‎‎‏‎‏‎‏‏‎Tethering is disabled‎‏‎‎‏‎"</string>
+ <string name="disable_tether_notification_message" msgid="2913366428516852495">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‎‎‎‏‏‎‏‏‏‎‎‏‎‏‏‎‏‏‎‏‎‏‎‏‎‎‏‏‎‎‎‎‎‎‎‏‎‎‏‎‏‏‏‎‏‎‎‎‏‏‎‎‎‎‏‏‏‏‎Contact your admin for details‎‏‎‎‏‎"</string>
+</resources>
diff --git a/packages/Tethering/res/values-es-rUS/strings.xml b/packages/Tethering/res/values-es-rUS/strings.xml
new file mode 100644
index 000000000000..e4618b8cec96
--- /dev/null
+++ b/packages/Tethering/res/values-es-rUS/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="tethered_notification_title" msgid="3146694234398202601">"Anclaje a red o zona activa conectados"</string>
+ <string name="tethered_notification_message" msgid="2113628520792055377">"Presiona para configurar."</string>
+ <string name="disable_tether_notification_title" msgid="7526977944111313195">"Se inhabilitó la conexión mediante dispositivo portátil"</string>
+ <string name="disable_tether_notification_message" msgid="2913366428516852495">"Para obtener más información, comunícate con el administrador"</string>
+</resources>
diff --git a/packages/Tethering/res/values-es/strings.xml b/packages/Tethering/res/values-es/strings.xml
new file mode 100644
index 000000000000..8dc1575ce8ea
--- /dev/null
+++ b/packages/Tethering/res/values-es/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="tethered_notification_title" msgid="3146694234398202601">"Compartir conexión/Zona Wi-Fi activada"</string>
+ <string name="tethered_notification_message" msgid="2113628520792055377">"Toca para configurar."</string>
+ <string name="disable_tether_notification_title" msgid="7526977944111313195">"La conexión compartida está inhabilitada"</string>
+ <string name="disable_tether_notification_message" msgid="2913366428516852495">"Ponte en contacto con el administrador para obtener más información"</string>
+</resources>
diff --git a/packages/Tethering/res/values-et/strings.xml b/packages/Tethering/res/values-et/strings.xml
new file mode 100644
index 000000000000..872c8a74cc59
--- /dev/null
+++ b/packages/Tethering/res/values-et/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="tethered_notification_title" msgid="3146694234398202601">"Jagamine või kuumkoht on aktiivne"</string>
+ <string name="tethered_notification_message" msgid="2113628520792055377">"Puudutage seadistamiseks."</string>
+ <string name="disable_tether_notification_title" msgid="7526977944111313195">"Jagamine on keelatud"</string>
+ <string name="disable_tether_notification_message" msgid="2913366428516852495">"Lisateabe saamiseks võtke ühendust oma administraatoriga"</string>
+</resources>
diff --git a/packages/Tethering/res/values-eu/strings.xml b/packages/Tethering/res/values-eu/strings.xml
new file mode 100644
index 000000000000..6c4605e616c1
--- /dev/null
+++ b/packages/Tethering/res/values-eu/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="tethered_notification_title" msgid="3146694234398202601">"Konexioa partekatzea edo sare publikoa aktibo"</string>
+ <string name="tethered_notification_message" msgid="2113628520792055377">"Sakatu konfiguratzeko."</string>
+ <string name="disable_tether_notification_title" msgid="7526977944111313195">"Desgaituta dago konexioa partekatzeko aukera"</string>
+ <string name="disable_tether_notification_message" msgid="2913366428516852495">"Xehetasunak lortzeko, jarri administratzailearekin harremanetan"</string>
+</resources>
diff --git a/packages/Tethering/res/values-fa/strings.xml b/packages/Tethering/res/values-fa/strings.xml
new file mode 100644
index 000000000000..bc2ee23609c3
--- /dev/null
+++ b/packages/Tethering/res/values-fa/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="tethered_notification_title" msgid="3146694234398202601">"اشتراک‌گذاری اینترنت یا نقطه اتصال فعال"</string>
+ <string name="tethered_notification_message" msgid="2113628520792055377">"برای راه‌اندازی ضربه بزنید."</string>
+ <string name="disable_tether_notification_title" msgid="7526977944111313195">"اشتراک‌گذاری اینترنت غیرفعال است"</string>
+ <string name="disable_tether_notification_message" msgid="2913366428516852495">"برای جزئیات، با سرپرستتان تماس بگیرید"</string>
+</resources>
diff --git a/packages/Tethering/res/values-fi/strings.xml b/packages/Tethering/res/values-fi/strings.xml
new file mode 100644
index 000000000000..ff0fca6502df
--- /dev/null
+++ b/packages/Tethering/res/values-fi/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="tethered_notification_title" msgid="3146694234398202601">"Internetin jakaminen tai yhteyspiste käytössä"</string>
+ <string name="tethered_notification_message" msgid="2113628520792055377">"Määritä napauttamalla."</string>
+ <string name="disable_tether_notification_title" msgid="7526977944111313195">"Yhteyden jakaminen poistettu käytöstä"</string>
+ <string name="disable_tether_notification_message" msgid="2913366428516852495">"Kysy lisätietoja järjestelmänvalvojalta."</string>
+</resources>
diff --git a/packages/Tethering/res/values-fr-rCA/strings.xml b/packages/Tethering/res/values-fr-rCA/strings.xml
new file mode 100644
index 000000000000..1f5df0ee0cb0
--- /dev/null
+++ b/packages/Tethering/res/values-fr-rCA/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="tethered_notification_title" msgid="3146694234398202601">"Partage de connexion ou point d\'accès sans fil activé"</string>
+ <string name="tethered_notification_message" msgid="2113628520792055377">"Touchez pour configurer."</string>
+ <string name="disable_tether_notification_title" msgid="7526977944111313195">"Le partage de connexion est désactivé"</string>
+ <string name="disable_tether_notification_message" msgid="2913366428516852495">"Communiquez avec votre administrateur pour obtenir plus de détails"</string>
+</resources>
diff --git a/packages/Tethering/res/values-fr/strings.xml b/packages/Tethering/res/values-fr/strings.xml
new file mode 100644
index 000000000000..daf7c9d830d5
--- /dev/null
+++ b/packages/Tethering/res/values-fr/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="tethered_notification_title" msgid="3146694234398202601">"Partage de connexion ou point d\'accès sans fil activé"</string>
+ <string name="tethered_notification_message" msgid="2113628520792055377">"Appuyez ici pour configurer."</string>
+ <string name="disable_tether_notification_title" msgid="7526977944111313195">"Le partage de connexion est désactivé"</string>
+ <string name="disable_tether_notification_message" msgid="2913366428516852495">"Pour en savoir plus, contactez votre administrateur"</string>
+</resources>
diff --git a/packages/Tethering/res/values-gl/strings.xml b/packages/Tethering/res/values-gl/strings.xml
new file mode 100644
index 000000000000..0d16a1de094f
--- /dev/null
+++ b/packages/Tethering/res/values-gl/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="tethered_notification_title" msgid="3146694234398202601">"Conexión compartida ou zona wifi activada"</string>
+ <string name="tethered_notification_message" msgid="2113628520792055377">"Tocar para configurar."</string>
+ <string name="disable_tether_notification_title" msgid="7526977944111313195">"A conexión compartida está desactivada"</string>
+ <string name="disable_tether_notification_message" msgid="2913366428516852495">"Contacta co administrador para obter información"</string>
+</resources>
diff --git a/packages/Tethering/res/values-gu/strings.xml b/packages/Tethering/res/values-gu/strings.xml
new file mode 100644
index 000000000000..9d6b02f85fc9
--- /dev/null
+++ b/packages/Tethering/res/values-gu/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="tethered_notification_title" msgid="3146694234398202601">"ટિથરિંગ અથવા હૉટસ્પૉટ સક્રિય"</string>
+ <string name="tethered_notification_message" msgid="2113628520792055377">"સેટ કરવા માટે ટૅપ કરો."</string>
+ <string name="disable_tether_notification_title" msgid="7526977944111313195">"ટિથરિંગ અક્ષમ કરેલ છે"</string>
+ <string name="disable_tether_notification_message" msgid="2913366428516852495">"વિગતો માટે તમારા વ્યવસ્થાપકનો સંપર્ક કરો"</string>
+</resources>
diff --git a/packages/Tethering/res/values-hi/strings.xml b/packages/Tethering/res/values-hi/strings.xml
new file mode 100644
index 000000000000..9c29d9a8f9a1
--- /dev/null
+++ b/packages/Tethering/res/values-hi/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="tethered_notification_title" msgid="3146694234398202601">"टेदरिंग या हॉटस्‍पॉट सक्रिय"</string>
+ <string name="tethered_notification_message" msgid="2113628520792055377">"सेट करने के लिए टैप करें."</string>
+ <string name="disable_tether_notification_title" msgid="7526977944111313195">"टेदरिंग अक्षम है"</string>
+ <string name="disable_tether_notification_message" msgid="2913366428516852495">"जानकारी के लिए अपने एडमिन से संपर्क करें"</string>
+</resources>
diff --git a/packages/Tethering/res/values-hr/strings.xml b/packages/Tethering/res/values-hr/strings.xml
new file mode 100644
index 000000000000..d0d25bb755aa
--- /dev/null
+++ b/packages/Tethering/res/values-hr/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="tethered_notification_title" msgid="3146694234398202601">"Ograničenje ili aktivan hotspot"</string>
+ <string name="tethered_notification_message" msgid="2113628520792055377">"Dodirnite da biste postavili."</string>
+ <string name="disable_tether_notification_title" msgid="7526977944111313195">"Modemsko je povezivanje onemogućeno"</string>
+ <string name="disable_tether_notification_message" msgid="2913366428516852495">"Obratite se administratoru da biste saznali pojedinosti"</string>
+</resources>
diff --git a/packages/Tethering/res/values-hu/strings.xml b/packages/Tethering/res/values-hu/strings.xml
new file mode 100644
index 000000000000..31296599231e
--- /dev/null
+++ b/packages/Tethering/res/values-hu/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="tethered_notification_title" msgid="3146694234398202601">"Megosztás vagy aktív hotspot"</string>
+ <string name="tethered_notification_message" msgid="2113628520792055377">"Koppintson a beállításhoz."</string>
+ <string name="disable_tether_notification_title" msgid="7526977944111313195">"Az internetmegosztás le van tiltva"</string>
+ <string name="disable_tether_notification_message" msgid="2913366428516852495">"A részletekért forduljon rendszergazdájához"</string>
+</resources>
diff --git a/packages/Tethering/res/values-hy/strings.xml b/packages/Tethering/res/values-hy/strings.xml
new file mode 100644
index 000000000000..8ba6435fd58e
--- /dev/null
+++ b/packages/Tethering/res/values-hy/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="tethered_notification_title" msgid="3146694234398202601">"Մոդեմի ռեժիմը միացված է"</string>
+ <string name="tethered_notification_message" msgid="2113628520792055377">"Հպեք՝ կարգավորելու համար:"</string>
+ <string name="disable_tether_notification_title" msgid="7526977944111313195">"Մոդեմի ռեժիմն անջատված է"</string>
+ <string name="disable_tether_notification_message" msgid="2913366428516852495">"Մանրամասների համար դիմեք ձեր ադմինիստրատորին"</string>
+</resources>
diff --git a/packages/Tethering/res/values-in/strings.xml b/packages/Tethering/res/values-in/strings.xml
new file mode 100644
index 000000000000..1e093ab237e8
--- /dev/null
+++ b/packages/Tethering/res/values-in/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="tethered_notification_title" msgid="3146694234398202601">"Tethering (Penambatan) atau hotspot aktif"</string>
+ <string name="tethered_notification_message" msgid="2113628520792055377">"Ketuk untuk menyiapkan."</string>
+ <string name="disable_tether_notification_title" msgid="7526977944111313195">"Tethering dinonaktifkan"</string>
+ <string name="disable_tether_notification_message" msgid="2913366428516852495">"Hubungi admin untuk mengetahui detailnya"</string>
+</resources>
diff --git a/packages/Tethering/res/values-is/strings.xml b/packages/Tethering/res/values-is/strings.xml
new file mode 100644
index 000000000000..f5769d5344ae
--- /dev/null
+++ b/packages/Tethering/res/values-is/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="tethered_notification_title" msgid="3146694234398202601">"Kveikt á tjóðrun eða aðgangsstað"</string>
+ <string name="tethered_notification_message" msgid="2113628520792055377">"Ýttu til að setja upp."</string>
+ <string name="disable_tether_notification_title" msgid="7526977944111313195">"Slökkt er á tjóðrun"</string>
+ <string name="disable_tether_notification_message" msgid="2913366428516852495">"Hafðu samband við kerfisstjórann til að fá upplýsingar"</string>
+</resources>
diff --git a/packages/Tethering/res/values-it/strings.xml b/packages/Tethering/res/values-it/strings.xml
new file mode 100644
index 000000000000..e0b3724325fc
--- /dev/null
+++ b/packages/Tethering/res/values-it/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="tethered_notification_title" msgid="3146694234398202601">"Tethering oppure hotspot attivo"</string>
+ <string name="tethered_notification_message" msgid="2113628520792055377">"Tocca per impostare."</string>
+ <string name="disable_tether_notification_title" msgid="7526977944111313195">"Tethering disattivato"</string>
+ <string name="disable_tether_notification_message" msgid="2913366428516852495">"Contatta il tuo amministratore per avere informazioni dettagliate"</string>
+</resources>
diff --git a/packages/Tethering/res/values-iw/strings.xml b/packages/Tethering/res/values-iw/strings.xml
new file mode 100644
index 000000000000..c002c44b2361
--- /dev/null
+++ b/packages/Tethering/res/values-iw/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="tethered_notification_title" msgid="3146694234398202601">"שיתוף אינטרנט פעיל"</string>
+ <string name="tethered_notification_message" msgid="2113628520792055377">"הקש כדי להגדיר."</string>
+ <string name="disable_tether_notification_title" msgid="7526977944111313195">"שיתוף האינטרנט בין ניידים מושבת"</string>
+ <string name="disable_tether_notification_message" msgid="2913366428516852495">"לפרטים, יש לפנות למנהל המערכת"</string>
+</resources>
diff --git a/packages/Tethering/res/values-ja/strings.xml b/packages/Tethering/res/values-ja/strings.xml
new file mode 100644
index 000000000000..314bde00df02
--- /dev/null
+++ b/packages/Tethering/res/values-ja/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="tethered_notification_title" msgid="3146694234398202601">"テザリングまたはアクセスポイントが有効です"</string>
+ <string name="tethered_notification_message" msgid="2113628520792055377">"タップしてセットアップします。"</string>
+ <string name="disable_tether_notification_title" msgid="7526977944111313195">"テザリングは無効に設定されています"</string>
+ <string name="disable_tether_notification_message" msgid="2913366428516852495">"詳しくは、管理者にお問い合わせください"</string>
+</resources>
diff --git a/packages/Tethering/res/values-ka/strings.xml b/packages/Tethering/res/values-ka/strings.xml
new file mode 100644
index 000000000000..7bbd81d3435a
--- /dev/null
+++ b/packages/Tethering/res/values-ka/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="tethered_notification_title" msgid="3146694234398202601">"ტეტერინგი ან უსადენო ქსელი აქტიურია"</string>
+ <string name="tethered_notification_message" msgid="2113628520792055377">"შეეხეთ დასაყენებლად."</string>
+ <string name="disable_tether_notification_title" msgid="7526977944111313195">"ტეტერინგი გათიშულია"</string>
+ <string name="disable_tether_notification_message" msgid="2913366428516852495">"დამატებითი ინფორმაციისთვის დაუკავშირდით თქვენს ადმინისტრატორს"</string>
+</resources>
diff --git a/packages/Tethering/res/values-kk/strings.xml b/packages/Tethering/res/values-kk/strings.xml
new file mode 100644
index 000000000000..7fd87a159657
--- /dev/null
+++ b/packages/Tethering/res/values-kk/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="tethered_notification_title" msgid="3146694234398202601">"Тетеринг немесе хотспот қосулы"</string>
+ <string name="tethered_notification_message" msgid="2113628520792055377">"Реттеу үшін түртіңіз."</string>
+ <string name="disable_tether_notification_title" msgid="7526977944111313195">"Тетеринг өшірілді"</string>
+ <string name="disable_tether_notification_message" msgid="2913366428516852495">"Мәліметтерді әкімшіден алыңыз"</string>
+</resources>
diff --git a/packages/Tethering/res/values-km/strings.xml b/packages/Tethering/res/values-km/strings.xml
new file mode 100644
index 000000000000..2f852246790c
--- /dev/null
+++ b/packages/Tethering/res/values-km/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="tethered_notification_title" msgid="3146694234398202601">"ភ្ជាប់ ឬ​ហតស្ពត​សកម្ម"</string>
+ <string name="tethered_notification_message" msgid="2113628520792055377">"ប៉ះដើម្បីកំណត់"</string>
+ <string name="disable_tether_notification_title" msgid="7526977944111313195">"ការភ្ជាប់​ត្រូវបានបិទ"</string>
+ <string name="disable_tether_notification_message" msgid="2913366428516852495">"ទាក់ទងអ្នកគ្រប់គ្រង​របស់អ្នកសម្រាប់​ព័ត៌មានលម្អិត"</string>
+</resources>
diff --git a/packages/Tethering/res/values-kn/strings.xml b/packages/Tethering/res/values-kn/strings.xml
new file mode 100644
index 000000000000..f11a83ea40ee
--- /dev/null
+++ b/packages/Tethering/res/values-kn/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="tethered_notification_title" msgid="3146694234398202601">"ಟೆಥರಿಂಗ್ ಅಥವಾ ಹಾಟ್‌ಸ್ಪಾಟ್ ಸಕ್ರಿಯವಾಗಿದೆ"</string>
+ <string name="tethered_notification_message" msgid="2113628520792055377">"ಹೊಂದಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
+ <string name="disable_tether_notification_title" msgid="7526977944111313195">"ಟೆಥರಿಂಗ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ"</string>
+ <string name="disable_tether_notification_message" msgid="2913366428516852495">"ವಿವರಗಳಿಗಾಗಿ ನಿಮ್ಮ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಿ"</string>
+</resources>
diff --git a/packages/Tethering/res/values-ko/strings.xml b/packages/Tethering/res/values-ko/strings.xml
new file mode 100644
index 000000000000..57f24f5b1ae2
--- /dev/null
+++ b/packages/Tethering/res/values-ko/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="tethered_notification_title" msgid="3146694234398202601">"테더링 또는 핫스팟 사용"</string>
+ <string name="tethered_notification_message" msgid="2113628520792055377">"설정하려면 탭하세요."</string>
+ <string name="disable_tether_notification_title" msgid="7526977944111313195">"테더링이 사용 중지됨"</string>
+ <string name="disable_tether_notification_message" msgid="2913366428516852495">"자세한 정보는 관리자에게 문의하세요."</string>
+</resources>
diff --git a/packages/Tethering/res/values-ky/strings.xml b/packages/Tethering/res/values-ky/strings.xml
new file mode 100644
index 000000000000..79854859d41e
--- /dev/null
+++ b/packages/Tethering/res/values-ky/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="tethered_notification_title" msgid="3146694234398202601">"Жалгаштыруу же хотспот жандырылган"</string>
+ <string name="tethered_notification_message" msgid="2113628520792055377">"Жөндөө үчүн таптап коюңуз."</string>
+ <string name="disable_tether_notification_title" msgid="7526977944111313195">"Жалгаштыруу функциясы өчүрүлгөн"</string>
+ <string name="disable_tether_notification_message" msgid="2913366428516852495">"Кеңири маалымат үчүн администраторуңузга кайрылыңыз"</string>
+</resources>
diff --git a/packages/Tethering/res/values-lo/strings.xml b/packages/Tethering/res/values-lo/strings.xml
new file mode 100644
index 000000000000..78f1585f60f7
--- /dev/null
+++ b/packages/Tethering/res/values-lo/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="tethered_notification_title" msgid="3146694234398202601">"ເປີດ​ການ​ປ່ອຍ​ສັນຍານ ຫຼື​ຮັອດສະປອດ​ແລ້ວ"</string>
+ <string name="tethered_notification_message" msgid="2113628520792055377">"ແຕະເພື່ອຕັ້ງຄ່າ."</string>
+ <string name="disable_tether_notification_title" msgid="7526977944111313195">"ການປ່ອຍສັນຍານຖືກປິດໄວ້"</string>
+ <string name="disable_tether_notification_message" msgid="2913366428516852495">"ຕິດຕໍ່ຜູ້ເບິ່ງແຍງລະບົບສຳລັບລາຍລະອຽດ"</string>
+</resources>
diff --git a/packages/Tethering/res/values-lt/strings.xml b/packages/Tethering/res/values-lt/strings.xml
new file mode 100644
index 000000000000..ebff8ac9d1f1
--- /dev/null
+++ b/packages/Tethering/res/values-lt/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="tethered_notification_title" msgid="3146694234398202601">"Susietas ar aktyvus"</string>
+ <string name="tethered_notification_message" msgid="2113628520792055377">"Palieskite, kad nustatytumėte."</string>
+ <string name="disable_tether_notification_title" msgid="7526977944111313195">"Įrenginio kaip modemo naudojimas išjungtas"</string>
+ <string name="disable_tether_notification_message" msgid="2913366428516852495">"Jei reikia išsamios informacijos, susisiekite su administratoriumi"</string>
+</resources>
diff --git a/packages/Tethering/res/values-lv/strings.xml b/packages/Tethering/res/values-lv/strings.xml
new file mode 100644
index 000000000000..54d0048b526a
--- /dev/null
+++ b/packages/Tethering/res/values-lv/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="tethered_notification_title" msgid="3146694234398202601">"Piesaiste vai tīklājs ir aktīvs."</string>
+ <string name="tethered_notification_message" msgid="2113628520792055377">"Pieskarieties, lai iestatītu."</string>
+ <string name="disable_tether_notification_title" msgid="7526977944111313195">"Piesaiste ir atspējota"</string>
+ <string name="disable_tether_notification_message" msgid="2913366428516852495">"Lai iegūtu detalizētu informāciju, sazinieties ar savu administratoru."</string>
+</resources>
diff --git a/packages/Tethering/res/values-mk/strings.xml b/packages/Tethering/res/values-mk/strings.xml
new file mode 100644
index 000000000000..0fab8aa4761f
--- /dev/null
+++ b/packages/Tethering/res/values-mk/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="tethered_notification_title" msgid="3146694234398202601">"Поврзувањето или точката на пристап се активни"</string>
+ <string name="tethered_notification_message" msgid="2113628520792055377">"Допрете за поставување."</string>
+ <string name="disable_tether_notification_title" msgid="7526977944111313195">"Врзувањето е оневозможено"</string>
+ <string name="disable_tether_notification_message" msgid="2913366428516852495">"Контактирајте со администраторот за детали"</string>
+</resources>
diff --git a/packages/Tethering/res/values-ml/strings.xml b/packages/Tethering/res/values-ml/strings.xml
new file mode 100644
index 000000000000..fd7e556e3899
--- /dev/null
+++ b/packages/Tethering/res/values-ml/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="tethered_notification_title" msgid="3146694234398202601">"ടെതറിംഗ് അല്ലെങ്കിൽ ഹോട്ട്സ്‌പോട്ട് സജീവമാണ്"</string>
+ <string name="tethered_notification_message" msgid="2113628520792055377">"സജ്ജമാക്കാൻ ടാപ്പുചെയ്യുക."</string>
+ <string name="disable_tether_notification_title" msgid="7526977944111313195">"ടെതറിംഗ് പ്രവർത്തനരഹിതമാക്കിയിരിക്കുന്നു"</string>
+ <string name="disable_tether_notification_message" msgid="2913366428516852495">"വിശദവിവരങ്ങൾക്ക് നിങ്ങളുടെ അഡ്മിനെ ബന്ധപ്പെടുക"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mn/strings.xml b/packages/Tethering/res/values-mn/strings.xml
new file mode 100644
index 000000000000..4596577c5d95
--- /dev/null
+++ b/packages/Tethering/res/values-mn/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="tethered_notification_title" msgid="3146694234398202601">"Модем болгох эсвэл идэвхтэй цэг болгох"</string>
+ <string name="tethered_notification_message" msgid="2113628520792055377">"Тохируулахын тулд товшино уу."</string>
+ <string name="disable_tether_notification_title" msgid="7526977944111313195">"Модем болгох боломжгүй байна"</string>
+ <string name="disable_tether_notification_message" msgid="2913366428516852495">"Дэлгэрэнгүй мэдээлэл авахын тулд админтайгаа холбогдоно уу"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mr/strings.xml b/packages/Tethering/res/values-mr/strings.xml
new file mode 100644
index 000000000000..85c9ade4feee
--- /dev/null
+++ b/packages/Tethering/res/values-mr/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="tethered_notification_title" msgid="3146694234398202601">"टेदरिंग किंवा हॉटस्पॉट सक्रिय"</string>
+ <string name="tethered_notification_message" msgid="2113628520792055377">"सेट करण्यासाठी टॅप करा."</string>
+ <string name="disable_tether_notification_title" msgid="7526977944111313195">"टेदरिंग बंद आहे"</string>
+ <string name="disable_tether_notification_message" msgid="2913366428516852495">"तपशीलांसाठी तुमच्या प्रशासकाशी संपर्क साधा"</string>
+</resources>
diff --git a/packages/Tethering/res/values-ms/strings.xml b/packages/Tethering/res/values-ms/strings.xml
new file mode 100644
index 000000000000..ec6bdbda08e7
--- /dev/null
+++ b/packages/Tethering/res/values-ms/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="tethered_notification_title" msgid="3146694234398202601">"Penambatan atau titik panas aktif"</string>
+ <string name="tethered_notification_message" msgid="2113628520792055377">"Ketik untuk membuat persediaan."</string>
+ <string name="disable_tether_notification_title" msgid="7526977944111313195">"Penambatan dilumpuhkan"</string>
+ <string name="disable_tether_notification_message" msgid="2913366428516852495">"Hubungi pentadbir anda untuk maklumat lanjut"</string>
+</resources>
diff --git a/packages/Tethering/res/values-my/strings.xml b/packages/Tethering/res/values-my/strings.xml
new file mode 100644
index 000000000000..83978b67d433
--- /dev/null
+++ b/packages/Tethering/res/values-my/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="tethered_notification_title" msgid="3146694234398202601">"တဆင့်ပြန်လည်လွှင့်ခြင်း သို့မဟုတ် ဟော့စပေါ့ ဖွင့်ထားသည်"</string>
+ <string name="tethered_notification_message" msgid="2113628520792055377">"စနစ်ထည့်သွင်းရန် တို့ပါ။"</string>
+ <string name="disable_tether_notification_title" msgid="7526977944111313195">"မိုဘိုင်းဖုန်းကို မိုဒမ်အဖြစ်သုံးခြင်းအား ပိတ်ထားသည်"</string>
+ <string name="disable_tether_notification_message" msgid="2913366428516852495">"အသေးစိတ်အချက်အလက်များအတွက် သင့်စီမံခန့်ခွဲသူကို ဆက်သွယ်ပါ"</string>
+</resources>
diff --git a/packages/Tethering/res/values-nb/strings.xml b/packages/Tethering/res/values-nb/strings.xml
new file mode 100644
index 000000000000..9abf32dd7bf1
--- /dev/null
+++ b/packages/Tethering/res/values-nb/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="tethered_notification_title" msgid="3146694234398202601">"Internettdeling eller trådløs sone er aktiv"</string>
+ <string name="tethered_notification_message" msgid="2113628520792055377">"Trykk for å konfigurere."</string>
+ <string name="disable_tether_notification_title" msgid="7526977944111313195">"Internettdeling er slått av"</string>
+ <string name="disable_tether_notification_message" msgid="2913366428516852495">"Ta kontakt med administratoren din for å få mer informasjon"</string>
+</resources>
diff --git a/packages/Tethering/res/values-ne/strings.xml b/packages/Tethering/res/values-ne/strings.xml
new file mode 100644
index 000000000000..c8869298a546
--- /dev/null
+++ b/packages/Tethering/res/values-ne/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="tethered_notification_title" msgid="3146694234398202601">"टेथर गर्ने वा हटस्पट सक्रिय"</string>
+ <string name="tethered_notification_message" msgid="2113628520792055377">"सेटअप गर्न ट्याप गर्नुहोस्।"</string>
+ <string name="disable_tether_notification_title" msgid="7526977944111313195">"टेदरिङलाई असक्षम पारिएको छ"</string>
+ <string name="disable_tether_notification_message" msgid="2913366428516852495">"विवरणहरूका लागि आफ्ना प्रशासकलाई सम्पर्क गर्नुहोस्"</string>
+</resources>
diff --git a/packages/Tethering/res/values-nl/strings.xml b/packages/Tethering/res/values-nl/strings.xml
new file mode 100644
index 000000000000..0ec4bff62154
--- /dev/null
+++ b/packages/Tethering/res/values-nl/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="tethered_notification_title" msgid="3146694234398202601">"Tethering of hotspot actief"</string>
+ <string name="tethered_notification_message" msgid="2113628520792055377">"Tik om in te stellen."</string>
+ <string name="disable_tether_notification_title" msgid="7526977944111313195">"Tethering is uitgeschakeld"</string>
+ <string name="disable_tether_notification_message" msgid="2913366428516852495">"Neem contact op met je beheerder voor meer informatie"</string>
+</resources>
diff --git a/packages/Tethering/res/values-or/strings.xml b/packages/Tethering/res/values-or/strings.xml
new file mode 100644
index 000000000000..457685795a16
--- /dev/null
+++ b/packages/Tethering/res/values-or/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="tethered_notification_title" msgid="3146694234398202601">"ଟିଥରିଙ୍ଗ କିମ୍ୱା ହଟସ୍ପଟ୍‌ ସକ୍ରିୟ ଅଛି"</string>
+ <string name="tethered_notification_message" msgid="2113628520792055377">"ସେଟଅପ୍‍ କରିବାକୁ ଟାପ୍‍ କରନ୍ତୁ।"</string>
+ <string name="disable_tether_notification_title" msgid="7526977944111313195">"ଟିଥରିଙ୍ଗ ଅକ୍ଷମ କରାଯାଇଛି"</string>
+ <string name="disable_tether_notification_message" msgid="2913366428516852495">"ବିବରଣୀ ପାଇଁ ନିଜ ଆଡମିନ୍‌ଙ୍କ ସହ ଯୋଗାଯୋଗ କରନ୍ତୁ"</string>
+</resources>
diff --git a/packages/Tethering/res/values-pa/strings.xml b/packages/Tethering/res/values-pa/strings.xml
new file mode 100644
index 000000000000..deddf2ea27f7
--- /dev/null
+++ b/packages/Tethering/res/values-pa/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="tethered_notification_title" msgid="3146694234398202601">"ਟੈਦਰਿੰਗ ਜਾਂ ਹੌਟਸਪੌਟ ਕਿਰਿਆਸ਼ੀਲ"</string>
+ <string name="tethered_notification_message" msgid="2113628520792055377">"ਸਥਾਪਤ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ।"</string>
+ <string name="disable_tether_notification_title" msgid="7526977944111313195">"ਟੈਦਰਿੰਗ ਨੂੰ ਅਯੋਗ ਬਣਾਇਆ ਗਿਆ ਹੈ"</string>
+ <string name="disable_tether_notification_message" msgid="2913366428516852495">"ਵੇਰਵਿਆਂ ਲਈ ਆਪਣੇ ਪ੍ਰਸ਼ਾਸਕ ਨੂੰ ਸੰਪਰਕ ਕਰੋ"</string>
+</resources>
diff --git a/packages/Tethering/res/values-pl/strings.xml b/packages/Tethering/res/values-pl/strings.xml
new file mode 100644
index 000000000000..48d8468935a1
--- /dev/null
+++ b/packages/Tethering/res/values-pl/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="tethered_notification_title" msgid="3146694234398202601">"Aktywny tethering lub punkt dostępu"</string>
+ <string name="tethered_notification_message" msgid="2113628520792055377">"Kliknij, by skonfigurować."</string>
+ <string name="disable_tether_notification_title" msgid="7526977944111313195">"Tethering został wyłączony"</string>
+ <string name="disable_tether_notification_message" msgid="2913366428516852495">"Aby uzyskać szczegółowe informacje, skontaktuj się z administratorem"</string>
+</resources>
diff --git a/packages/Tethering/res/values-pt-rBR/strings.xml b/packages/Tethering/res/values-pt-rBR/strings.xml
new file mode 100644
index 000000000000..32c22b8713b5
--- /dev/null
+++ b/packages/Tethering/res/values-pt-rBR/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="tethered_notification_title" msgid="3146694234398202601">"Ponto de acesso ou tethering ativo"</string>
+ <string name="tethered_notification_message" msgid="2113628520792055377">"Toque para configurar."</string>
+ <string name="disable_tether_notification_title" msgid="7526977944111313195">"Tethering desativado"</string>
+ <string name="disable_tether_notification_message" msgid="2913366428516852495">"Fale com seu administrador para saber detalhes"</string>
+</resources>
diff --git a/packages/Tethering/res/values-pt-rPT/strings.xml b/packages/Tethering/res/values-pt-rPT/strings.xml
new file mode 100644
index 000000000000..641e22f44f25
--- /dev/null
+++ b/packages/Tethering/res/values-pt-rPT/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="tethered_notification_title" msgid="3146694234398202601">"Ligação ponto a ponto ou hotspot activos"</string>
+ <string name="tethered_notification_message" msgid="2113628520792055377">"Toque para configurar."</string>
+ <string name="disable_tether_notification_title" msgid="7526977944111313195">"A ligação (à Internet) via telemóvel está desativada."</string>
+ <string name="disable_tether_notification_message" msgid="2913366428516852495">"Contacte o gestor para obter detalhes."</string>
+</resources>
diff --git a/packages/Tethering/res/values-pt/strings.xml b/packages/Tethering/res/values-pt/strings.xml
new file mode 100644
index 000000000000..32c22b8713b5
--- /dev/null
+++ b/packages/Tethering/res/values-pt/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="tethered_notification_title" msgid="3146694234398202601">"Ponto de acesso ou tethering ativo"</string>
+ <string name="tethered_notification_message" msgid="2113628520792055377">"Toque para configurar."</string>
+ <string name="disable_tether_notification_title" msgid="7526977944111313195">"Tethering desativado"</string>
+ <string name="disable_tether_notification_message" msgid="2913366428516852495">"Fale com seu administrador para saber detalhes"</string>
+</resources>
diff --git a/packages/Tethering/res/values-ro/strings.xml b/packages/Tethering/res/values-ro/strings.xml
new file mode 100644
index 000000000000..f861f733b4a1
--- /dev/null
+++ b/packages/Tethering/res/values-ro/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="tethered_notification_title" msgid="3146694234398202601">"Tethering sau hotspot activ"</string>
+ <string name="tethered_notification_message" msgid="2113628520792055377">"Atingeți ca să configurați."</string>
+ <string name="disable_tether_notification_title" msgid="7526977944111313195">"Tetheringul este dezactivat"</string>
+ <string name="disable_tether_notification_message" msgid="2913366428516852495">"Contactați administratorul pentru detalii"</string>
+</resources>
diff --git a/packages/Tethering/res/values-ru/strings.xml b/packages/Tethering/res/values-ru/strings.xml
new file mode 100644
index 000000000000..027cb410c54c
--- /dev/null
+++ b/packages/Tethering/res/values-ru/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="tethered_notification_title" msgid="3146694234398202601">"Включен режим модема"</string>
+ <string name="tethered_notification_message" msgid="2113628520792055377">"Нажмите, чтобы настроить."</string>
+ <string name="disable_tether_notification_title" msgid="7526977944111313195">"Включить режим модема нельзя"</string>
+ <string name="disable_tether_notification_message" msgid="2913366428516852495">"Обратитесь к администратору, чтобы узнать подробности."</string>
+</resources>
diff --git a/packages/Tethering/res/values-si/strings.xml b/packages/Tethering/res/values-si/strings.xml
new file mode 100644
index 000000000000..7d8599f2c2d9
--- /dev/null
+++ b/packages/Tethering/res/values-si/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="tethered_notification_title" msgid="3146694234398202601">"ටෙදරින් හෝ හොට්ස්පොට් සක්‍රීයයි"</string>
+ <string name="tethered_notification_message" msgid="2113628520792055377">"පිහිටුවීමට තට්ටු කරන්න."</string>
+ <string name="disable_tether_notification_title" msgid="7526977944111313195">"ටෙදරින් අබල කර ඇත"</string>
+ <string name="disable_tether_notification_message" msgid="2913366428516852495">"විස්තර සඳහා ඔබගේ පරිපාලක අමතන්න"</string>
+</resources>
diff --git a/packages/Tethering/res/values-sk/strings.xml b/packages/Tethering/res/values-sk/strings.xml
new file mode 100644
index 000000000000..a8fe297c0088
--- /dev/null
+++ b/packages/Tethering/res/values-sk/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="tethered_notification_title" msgid="3146694234398202601">"Tethering alebo prístupový bod je aktívny"</string>
+ <string name="tethered_notification_message" msgid="2113628520792055377">"Klepnutím prejdete na nastavenie."</string>
+ <string name="disable_tether_notification_title" msgid="7526977944111313195">"Tethering je deaktivovaný"</string>
+ <string name="disable_tether_notification_message" msgid="2913366428516852495">"O podrobnosti požiadajte svojho správcu"</string>
+</resources>
diff --git a/packages/Tethering/res/values-sl/strings.xml b/packages/Tethering/res/values-sl/strings.xml
new file mode 100644
index 000000000000..b5e5e3856f7b
--- /dev/null
+++ b/packages/Tethering/res/values-sl/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="tethered_notification_title" msgid="3146694234398202601">"Aktivna povezava z internetom ali dostopna točka sta aktivni"</string>
+ <string name="tethered_notification_message" msgid="2113628520792055377">"Dotaknite se, če želite nastaviti."</string>
+ <string name="disable_tether_notification_title" msgid="7526977944111313195">"Povezava z internetom prek mobilnega telefona je onemogočena"</string>
+ <string name="disable_tether_notification_message" msgid="2913366428516852495">"Za podrobnosti se obrnite na skrbnika"</string>
+</resources>
diff --git a/packages/Tethering/res/values-sq/strings.xml b/packages/Tethering/res/values-sq/strings.xml
new file mode 100644
index 000000000000..fdd4906cc51e
--- /dev/null
+++ b/packages/Tethering/res/values-sq/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="tethered_notification_title" msgid="3146694234398202601">"Lidhja e çiftimit ose ajo e qasjes në zona publike interneti është aktive"</string>
+ <string name="tethered_notification_message" msgid="2113628520792055377">"Trokit për ta konfiguruar."</string>
+ <string name="disable_tether_notification_title" msgid="7526977944111313195">"Lidhja e çiftimit është çaktivizuar"</string>
+ <string name="disable_tether_notification_message" msgid="2913366428516852495">"Kontakto me administratorin për detaje"</string>
+</resources>
diff --git a/packages/Tethering/res/values-sr/strings.xml b/packages/Tethering/res/values-sr/strings.xml
new file mode 100644
index 000000000000..9fab34589724
--- /dev/null
+++ b/packages/Tethering/res/values-sr/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="tethered_notification_title" msgid="3146694234398202601">"Активно повезивање са интернетом преко мобилног уређаја или хотспот"</string>
+ <string name="tethered_notification_message" msgid="2113628520792055377">"Додирните да бисте подесили."</string>
+ <string name="disable_tether_notification_title" msgid="7526977944111313195">"Привезивање је онемогућено"</string>
+ <string name="disable_tether_notification_message" msgid="2913366428516852495">"Потражите детаље од администратора"</string>
+</resources>
diff --git a/packages/Tethering/res/values-sv/strings.xml b/packages/Tethering/res/values-sv/strings.xml
new file mode 100644
index 000000000000..10eeb0fe12e1
--- /dev/null
+++ b/packages/Tethering/res/values-sv/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="tethered_notification_title" msgid="3146694234398202601">"Internetdelning eller surfzon aktiverad"</string>
+ <string name="tethered_notification_message" msgid="2113628520792055377">"Tryck om du vill konfigurera."</string>
+ <string name="disable_tether_notification_title" msgid="7526977944111313195">"Internetdelning har inaktiverats"</string>
+ <string name="disable_tether_notification_message" msgid="2913366428516852495">"Kontakta administratören om du vill veta mer"</string>
+</resources>
diff --git a/packages/Tethering/res/values-sw/strings.xml b/packages/Tethering/res/values-sw/strings.xml
new file mode 100644
index 000000000000..335396307730
--- /dev/null
+++ b/packages/Tethering/res/values-sw/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="tethered_notification_title" msgid="3146694234398202601">"Kushiriki au kusambaza intaneti kumewashwa"</string>
+ <string name="tethered_notification_message" msgid="2113628520792055377">"Gusa ili uweke mipangilio."</string>
+ <string name="disable_tether_notification_title" msgid="7526977944111313195">"Umezima kipengele cha kusambaza mtandao"</string>
+ <string name="disable_tether_notification_message" msgid="2913366428516852495">"Wasiliana na msimamizi wako ili upate maelezo zaidi"</string>
+</resources>
diff --git a/packages/Tethering/res/values-ta/strings.xml b/packages/Tethering/res/values-ta/strings.xml
new file mode 100644
index 000000000000..b1e5cc241376
--- /dev/null
+++ b/packages/Tethering/res/values-ta/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="tethered_notification_title" msgid="3146694234398202601">"டெதெரிங்/ஹாட்ஸ்பாட் இயங்குகிறது"</string>
+ <string name="tethered_notification_message" msgid="2113628520792055377">"அமைக்க, தட்டவும்."</string>
+ <string name="disable_tether_notification_title" msgid="7526977944111313195">"இணைப்பு முறை முடக்கப்பட்டுள்ளது"</string>
+ <string name="disable_tether_notification_message" msgid="2913366428516852495">"விவரங்களுக்கு, உங்கள் நிர்வாகியைத் தொடர்புகொள்ளவும்"</string>
+</resources>
diff --git a/packages/Tethering/res/values-te/strings.xml b/packages/Tethering/res/values-te/strings.xml
new file mode 100644
index 000000000000..aae40dee40db
--- /dev/null
+++ b/packages/Tethering/res/values-te/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="tethered_notification_title" msgid="3146694234398202601">"టీథర్ చేయబడినది లేదా హాట్‌స్పాట్ సక్రియంగా ఉండేది"</string>
+ <string name="tethered_notification_message" msgid="2113628520792055377">"సెటప్ చేయడానికి నొక్కండి."</string>
+ <string name="disable_tether_notification_title" msgid="7526977944111313195">"టెథెరింగ్ నిలిపివేయబడింది"</string>
+ <string name="disable_tether_notification_message" msgid="2913366428516852495">"వివరాల కోసం మీ నిర్వాహకులను సంప్రదించండి"</string>
+</resources>
diff --git a/packages/Tethering/res/values-th/strings.xml b/packages/Tethering/res/values-th/strings.xml
new file mode 100644
index 000000000000..1b800565ad1f
--- /dev/null
+++ b/packages/Tethering/res/values-th/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="tethered_notification_title" msgid="3146694234398202601">"การปล่อยสัญญาณหรือฮอตสปอตทำงานอยู่"</string>
+ <string name="tethered_notification_message" msgid="2113628520792055377">"แตะเพื่อตั้งค่า"</string>
+ <string name="disable_tether_notification_title" msgid="7526977944111313195">"ปิดใช้การเชื่อมต่ออินเทอร์เน็ตผ่านมือถือแล้ว"</string>
+ <string name="disable_tether_notification_message" msgid="2913366428516852495">"ติดต่อผู้ดูแลระบบเพื่อขอรายละเอียด"</string>
+</resources>
diff --git a/packages/Tethering/res/values-tl/strings.xml b/packages/Tethering/res/values-tl/strings.xml
new file mode 100644
index 000000000000..12863f90e15a
--- /dev/null
+++ b/packages/Tethering/res/values-tl/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="tethered_notification_title" msgid="3146694234398202601">"Pagsasama o aktibong hotspot"</string>
+ <string name="tethered_notification_message" msgid="2113628520792055377">"I-tap upang i-set up."</string>
+ <string name="disable_tether_notification_title" msgid="7526977944111313195">"Naka-disable ang pag-tether"</string>
+ <string name="disable_tether_notification_message" msgid="2913366428516852495">"Makipag-ugnayan sa iyong admin para sa mga detalye"</string>
+</resources>
diff --git a/packages/Tethering/res/values-tr/strings.xml b/packages/Tethering/res/values-tr/strings.xml
new file mode 100644
index 000000000000..bfcf1ace2cf7
--- /dev/null
+++ b/packages/Tethering/res/values-tr/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="tethered_notification_title" msgid="3146694234398202601">"Tethering veya hotspot etkin"</string>
+ <string name="tethered_notification_message" msgid="2113628520792055377">"Ayarlamak için dokunun."</string>
+ <string name="disable_tether_notification_title" msgid="7526977944111313195">"Tethering devre dışı bırakıldı"</string>
+ <string name="disable_tether_notification_message" msgid="2913366428516852495">"Ayrıntılı bilgi için yöneticinize başvurun"</string>
+</resources>
diff --git a/packages/Tethering/res/values-uk/strings.xml b/packages/Tethering/res/values-uk/strings.xml
new file mode 100644
index 000000000000..8e159c072350
--- /dev/null
+++ b/packages/Tethering/res/values-uk/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="tethered_notification_title" msgid="3146694234398202601">"Прив\'язка чи точка дост. активна"</string>
+ <string name="tethered_notification_message" msgid="2113628520792055377">"Торкніться, щоб налаштувати."</string>
+ <string name="disable_tether_notification_title" msgid="7526977944111313195">"Використання телефона в режимі модема вимкнено"</string>
+ <string name="disable_tether_notification_message" msgid="2913366428516852495">"Щоб дізнатися більше, зв’яжіться з адміністратором"</string>
+</resources>
diff --git a/packages/Tethering/res/values-ur/strings.xml b/packages/Tethering/res/values-ur/strings.xml
new file mode 100644
index 000000000000..89195d4aae29
--- /dev/null
+++ b/packages/Tethering/res/values-ur/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="tethered_notification_title" msgid="3146694234398202601">"ٹیدرنگ یا ہاٹ اسپاٹ فعال"</string>
+ <string name="tethered_notification_message" msgid="2113628520792055377">"سیٹ اپ کرنے کیلئے تھپتھپائیں۔"</string>
+ <string name="disable_tether_notification_title" msgid="7526977944111313195">"ٹیدرنگ غیر فعال ہے"</string>
+ <string name="disable_tether_notification_message" msgid="2913366428516852495">"تفصیلات کے لئے اپنے منتظم سے رابطہ کریں"</string>
+</resources>
diff --git a/packages/Tethering/res/values-uz/strings.xml b/packages/Tethering/res/values-uz/strings.xml
new file mode 100644
index 000000000000..0ac4d4a7410a
--- /dev/null
+++ b/packages/Tethering/res/values-uz/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="tethered_notification_title" msgid="3146694234398202601">"Modem rejimi yoniq"</string>
+ <string name="tethered_notification_message" msgid="2113628520792055377">"Sozlash uchun bosing."</string>
+ <string name="disable_tether_notification_title" msgid="7526977944111313195">"Modem rejimi faolsizlantirildi"</string>
+ <string name="disable_tether_notification_message" msgid="2913366428516852495">"Tafsilotlari uchun administratoringizga murojaat qiling"</string>
+</resources>
diff --git a/packages/Tethering/res/values-vi/strings.xml b/packages/Tethering/res/values-vi/strings.xml
new file mode 100644
index 000000000000..85a4db8aa5da
--- /dev/null
+++ b/packages/Tethering/res/values-vi/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="tethered_notification_title" msgid="3146694234398202601">"Chức năng điểm truy cập Internet hoặc điểm phát sóng đang hoạt động"</string>
+ <string name="tethered_notification_message" msgid="2113628520792055377">"Nhấn để thiết lập."</string>
+ <string name="disable_tether_notification_title" msgid="7526977944111313195">"Đã tắt tính năng chia sẻ kết nối"</string>
+ <string name="disable_tether_notification_message" msgid="2913366428516852495">"Hãy liên hệ với quản trị viên của bạn để biết chi tiết"</string>
+</resources>
diff --git a/packages/Tethering/res/values-zh-rCN/strings.xml b/packages/Tethering/res/values-zh-rCN/strings.xml
new file mode 100644
index 000000000000..ff1fe039531c
--- /dev/null
+++ b/packages/Tethering/res/values-zh-rCN/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="tethered_notification_title" msgid="3146694234398202601">"网络共享或热点已启用"</string>
+ <string name="tethered_notification_message" msgid="2113628520792055377">"点按即可进行设置。"</string>
+ <string name="disable_tether_notification_title" msgid="7526977944111313195">"网络共享已停用"</string>
+ <string name="disable_tether_notification_message" msgid="2913366428516852495">"请与您的管理员联系以了解详情"</string>
+</resources>
diff --git a/packages/Tethering/res/values-zh-rHK/strings.xml b/packages/Tethering/res/values-zh-rHK/strings.xml
new file mode 100644
index 000000000000..0de39fac97f8
--- /dev/null
+++ b/packages/Tethering/res/values-zh-rHK/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="tethered_notification_title" msgid="3146694234398202601">"已啟用網絡共享或熱點"</string>
+ <string name="tethered_notification_message" msgid="2113628520792055377">"輕按即可設定。"</string>
+ <string name="disable_tether_notification_title" msgid="7526977944111313195">"網絡共享已停用"</string>
+ <string name="disable_tether_notification_message" msgid="2913366428516852495">"請聯絡您的管理員以瞭解詳情"</string>
+</resources>
diff --git a/packages/Tethering/res/values-zh-rTW/strings.xml b/packages/Tethering/res/values-zh-rTW/strings.xml
new file mode 100644
index 000000000000..9a117bbca43f
--- /dev/null
+++ b/packages/Tethering/res/values-zh-rTW/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="tethered_notification_title" msgid="3146694234398202601">"網路共用或無線基地台已啟用"</string>
+ <string name="tethered_notification_message" msgid="2113628520792055377">"輕觸即可進行設定。"</string>
+ <string name="disable_tether_notification_title" msgid="7526977944111313195">"數據連線已停用"</string>
+ <string name="disable_tether_notification_message" msgid="2913366428516852495">"詳情請洽你的管理員"</string>
+</resources>
diff --git a/packages/Tethering/res/values-zu/strings.xml b/packages/Tethering/res/values-zu/strings.xml
new file mode 100644
index 000000000000..8fe10d86cb03
--- /dev/null
+++ b/packages/Tethering/res/values-zu/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="tethered_notification_title" msgid="3146694234398202601">"Ukusebenzisa njengemodemu noma i-hotspot ephathekayo kuvuliwe"</string>
+ <string name="tethered_notification_message" msgid="2113628520792055377">"Thepha ukuze usethe."</string>
+ <string name="disable_tether_notification_title" msgid="7526977944111313195">"Ukusebenzisa ifoni njengemodemu kukhutshaziwe"</string>
+ <string name="disable_tether_notification_message" msgid="2913366428516852495">"Xhumana nomphathi wakho ukuze uthole imininingwane"</string>
+</resources>
diff --git a/packages/Tethering/res/values/strings.xml b/packages/Tethering/res/values/strings.xml
new file mode 100644
index 000000000000..ca866a946ea2
--- /dev/null
+++ b/packages/Tethering/res/values/strings.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+ <!-- Shown when the device is tethered -->
+ <!-- Strings for tethered notification title [CHAR LIMIT=200] -->
+ <string name="tethered_notification_title">Tethering or hotspot active</string>
+ <!-- Strings for tethered notification message [CHAR LIMIT=200] -->
+ <string name="tethered_notification_message">Tap to set up.</string>
+
+ <!-- This notification is shown when tethering has been disabled on a user's device.
+ The device is managed by the user's employer. Tethering can't be turned on unless the
+ IT administrator allows it. The noun "admin" is another reference for "IT administrator." -->
+ <!-- Strings for tether disabling notification title [CHAR LIMIT=200] -->
+ <string name="disable_tether_notification_title">Tethering is disabled</string>
+ <!-- Strings for tether disabling notification message [CHAR LIMIT=200] -->
+ <string name="disable_tether_notification_message">Contact your admin for details</string>
+</resources> \ No newline at end of file
diff --git a/packages/Tethering/src/com/android/server/connectivity/tethering/Tethering.java b/packages/Tethering/src/com/android/server/connectivity/tethering/Tethering.java
index f1228129cd92..7c78ef8994a2 100644
--- a/packages/Tethering/src/com/android/server/connectivity/tethering/Tethering.java
+++ b/packages/Tethering/src/com/android/server/connectivity/tethering/Tethering.java
@@ -109,6 +109,7 @@ import com.android.internal.util.MessageUtils;
import com.android.internal.util.Protocol;
import com.android.internal.util.State;
import com.android.internal.util.StateMachine;
+import com.android.tethering.R;
import java.io.FileDescriptor;
import java.io.PrintWriter;
@@ -675,14 +676,14 @@ public class Tethering {
int icon = 0;
switch(id) {
case SystemMessage.NOTE_TETHER_USB:
- icon = com.android.internal.R.drawable.stat_sys_tether_usb;
+ icon = R.drawable.stat_sys_tether_usb;
break;
case SystemMessage.NOTE_TETHER_BLUETOOTH:
- icon = com.android.internal.R.drawable.stat_sys_tether_bluetooth;
+ icon = R.drawable.stat_sys_tether_bluetooth;
break;
case SystemMessage.NOTE_TETHER_GENERAL:
default:
- icon = com.android.internal.R.drawable.stat_sys_tether_general;
+ icon = R.drawable.stat_sys_tether_general;
break;
}
@@ -702,16 +703,16 @@ public class Tethering {
PendingIntent pi = PendingIntent.getActivityAsUser(mContext, 0, intent, 0,
null, UserHandle.CURRENT);
- Resources r = Resources.getSystem();
+ Resources r = mContext.getResources();
final CharSequence title;
final CharSequence message;
if (tetheringOn) {
- title = r.getText(com.android.internal.R.string.tethered_notification_title);
- message = r.getText(com.android.internal.R.string.tethered_notification_message);
+ title = r.getText(R.string.tethered_notification_title);
+ message = r.getText(R.string.tethered_notification_message);
} else {
- title = r.getText(com.android.internal.R.string.disable_tether_notification_title);
- message = r.getText(com.android.internal.R.string.disable_tether_notification_message);
+ title = r.getText(R.string.disable_tether_notification_title);
+ message = r.getText(R.string.disable_tether_notification_message);
}
if (mTetheredNotificationBuilder == null) {
@@ -909,7 +910,7 @@ public class Tethering {
if (newlyDisallowed && isTetheringActiveOnDevice) {
mWrapper.showTetheredNotification(
- com.android.internal.R.drawable.stat_sys_tether_general, false);
+ R.drawable.stat_sys_tether_general, false);
mWrapper.untetherAll();
}
}
diff --git a/services/core/java/com/android/server/am/BatteryExternalStatsWorker.java b/services/core/java/com/android/server/am/BatteryExternalStatsWorker.java
index 0524f91a01fb..638111e01d2b 100644
--- a/services/core/java/com/android/server/am/BatteryExternalStatsWorker.java
+++ b/services/core/java/com/android/server/am/BatteryExternalStatsWorker.java
@@ -126,7 +126,7 @@ class BatteryExternalStatsWorker implements BatteryStatsImpl.ExternalStatsSync {
// Keep the last WiFi stats so we can compute a delta.
@GuardedBy("mWorkerLock")
private WifiActivityEnergyInfo mLastInfo =
- new WifiActivityEnergyInfo(0, 0, 0, new long[]{0}, 0, 0, 0, 0);
+ new WifiActivityEnergyInfo(0, 0, 0, 0, 0, 0, 0);
/**
* Timestamp at which all external stats were last collected in
@@ -548,42 +548,45 @@ class BatteryExternalStatsWorker implements BatteryStatsImpl.ExternalStatsSync {
@GuardedBy("mWorkerLock")
private WifiActivityEnergyInfo extractDeltaLocked(WifiActivityEnergyInfo latest) {
- final long timePeriodMs = latest.mTimestamp - mLastInfo.mTimestamp;
- final long lastScanMs = mLastInfo.mControllerScanTimeMs;
- final long lastIdleMs = mLastInfo.mControllerIdleTimeMs;
- final long lastTxMs = mLastInfo.mControllerTxTimeMs;
- final long lastRxMs = mLastInfo.mControllerRxTimeMs;
- final long lastEnergy = mLastInfo.mControllerEnergyUsed;
+ final long timePeriodMs = latest.getTimeSinceBootMillis()
+ - mLastInfo.getTimeSinceBootMillis();
+ final long lastScanMs = mLastInfo.getControllerScanDurationMillis();
+ final long lastIdleMs = mLastInfo.getControllerIdleDurationMillis();
+ final long lastTxMs = mLastInfo.getControllerTxDurationMillis();
+ final long lastRxMs = mLastInfo.getControllerRxDurationMillis();
+ final long lastEnergy = mLastInfo.getControllerEnergyUsedMicroJoules();
// We will modify the last info object to be the delta, and store the new
// WifiActivityEnergyInfo object as our last one.
final WifiActivityEnergyInfo delta = mLastInfo;
- delta.mTimestamp = latest.getTimeStamp();
- delta.mStackState = latest.getStackState();
+ delta.setTimeSinceBootMillis(latest.getTimeSinceBootMillis());
+ delta.setStackState(latest.getStackState());
- final long txTimeMs = latest.mControllerTxTimeMs - lastTxMs;
- final long rxTimeMs = latest.mControllerRxTimeMs - lastRxMs;
- final long idleTimeMs = latest.mControllerIdleTimeMs - lastIdleMs;
- final long scanTimeMs = latest.mControllerScanTimeMs - lastScanMs;
+ final long txTimeMs = latest.getControllerTxDurationMillis() - lastTxMs;
+ final long rxTimeMs = latest.getControllerRxDurationMillis() - lastRxMs;
+ final long idleTimeMs = latest.getControllerIdleDurationMillis() - lastIdleMs;
+ final long scanTimeMs = latest.getControllerScanDurationMillis() - lastScanMs;
if (txTimeMs < 0 || rxTimeMs < 0 || scanTimeMs < 0 || idleTimeMs < 0) {
// The stats were reset by the WiFi system (which is why our delta is negative).
// Returns the unaltered stats. The total on time should not exceed the time
// duartion between reports.
- final long totalOnTimeMs = latest.mControllerTxTimeMs + latest.mControllerRxTimeMs
- + latest.mControllerIdleTimeMs;
+ final long totalOnTimeMs = latest.getControllerTxDurationMillis()
+ + latest.getControllerRxDurationMillis()
+ + latest.getControllerIdleDurationMillis();
if (totalOnTimeMs <= timePeriodMs + MAX_WIFI_STATS_SAMPLE_ERROR_MILLIS) {
- delta.mControllerEnergyUsed = latest.mControllerEnergyUsed;
- delta.mControllerRxTimeMs = latest.mControllerRxTimeMs;
- delta.mControllerTxTimeMs = latest.mControllerTxTimeMs;
- delta.mControllerIdleTimeMs = latest.mControllerIdleTimeMs;
- delta.mControllerScanTimeMs = latest.mControllerScanTimeMs;
+ delta.setControllerEnergyUsedMicroJoules(
+ latest.getControllerEnergyUsedMicroJoules());
+ delta.setControllerRxDurationMillis(latest.getControllerRxDurationMillis());
+ delta.setControllerTxDurationMillis(latest.getControllerTxDurationMillis());
+ delta.setControllerIdleDurationMillis(latest.getControllerIdleDurationMillis());
+ delta.setControllerScanDurationMillis(latest.getControllerScanDurationMillis());
} else {
- delta.mControllerEnergyUsed = 0;
- delta.mControllerRxTimeMs = 0;
- delta.mControllerTxTimeMs = 0;
- delta.mControllerIdleTimeMs = 0;
- delta.mControllerScanTimeMs = 0;
+ delta.setControllerEnergyUsedMicroJoules(0);
+ delta.setControllerRxDurationMillis(0);
+ delta.setControllerTxDurationMillis(0);
+ delta.setControllerIdleDurationMillis(0);
+ delta.setControllerScanDurationMillis(0);
}
Slog.v(TAG, "WiFi energy data was reset, new WiFi energy data is " + delta);
} else {
@@ -608,28 +611,30 @@ class BatteryExternalStatsWorker implements BatteryStatsImpl.ExternalStatsSync {
sb.append(" e=").append(lastEnergy);
sb.append("\n");
sb.append("Current WiFi snapshot: ").append("idle=");
- TimeUtils.formatDuration(latest.mControllerIdleTimeMs, sb);
+ TimeUtils.formatDuration(latest.getControllerIdleDurationMillis(), sb);
sb.append(" rx=");
- TimeUtils.formatDuration(latest.mControllerRxTimeMs, sb);
+ TimeUtils.formatDuration(latest.getControllerRxDurationMillis(), sb);
sb.append(" tx=");
- TimeUtils.formatDuration(latest.mControllerTxTimeMs, sb);
- sb.append(" e=").append(latest.mControllerEnergyUsed);
+ TimeUtils.formatDuration(latest.getControllerTxDurationMillis(), sb);
+ sb.append(" e=").append(latest.getControllerEnergyUsedMicroJoules());
Slog.wtf(TAG, sb.toString());
}
} else {
maxExpectedIdleTimeMs = timePeriodMs - totalActiveTimeMs;
}
// These times seem to be the most reliable.
- delta.mControllerTxTimeMs = txTimeMs;
- delta.mControllerRxTimeMs = rxTimeMs;
- delta.mControllerScanTimeMs = scanTimeMs;
+ delta.setControllerTxDurationMillis(txTimeMs);
+ delta.setControllerRxDurationMillis(rxTimeMs);
+ delta.setControllerScanDurationMillis(scanTimeMs);
// WiFi calculates the idle time as a difference from the on time and the various
// Rx + Tx times. There seems to be some missing time there because this sometimes
// becomes negative. Just cap it at 0 and ensure that it is less than the expected idle
// time from the difference in timestamps.
// b/21613534
- delta.mControllerIdleTimeMs = Math.min(maxExpectedIdleTimeMs, Math.max(0, idleTimeMs));
- delta.mControllerEnergyUsed = Math.max(0, latest.mControllerEnergyUsed - lastEnergy);
+ delta.setControllerIdleDurationMillis(
+ Math.min(maxExpectedIdleTimeMs, Math.max(0, idleTimeMs)));
+ delta.setControllerEnergyUsedMicroJoules(
+ Math.max(0, latest.getControllerEnergyUsedMicroJoules() - lastEnergy));
}
mLastInfo = latest;
diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java
index 863991cec3bd..3c76c679ec93 100755
--- a/services/core/java/com/android/server/notification/NotificationManagerService.java
+++ b/services/core/java/com/android/server/notification/NotificationManagerService.java
@@ -8268,7 +8268,7 @@ public class NotificationManagerService extends SystemService {
try {
assistant.onAllowedAdjustmentsChanged();
} catch (RemoteException ex) {
- Slog.e(TAG, "unable to notify assistant (capabilities): " + assistant, ex);
+ Slog.e(TAG, "unable to notify assistant (capabilities): " + info, ex);
}
}
@@ -8278,7 +8278,7 @@ public class NotificationManagerService extends SystemService {
try {
assistant.onNotificationsSeen(keys);
} catch (RemoteException ex) {
- Slog.e(TAG, "unable to notify assistant (seen): " + assistant, ex);
+ Slog.e(TAG, "unable to notify assistant (seen): " + info, ex);
}
}
@@ -8584,7 +8584,7 @@ public class NotificationManagerService extends SystemService {
listener.onStatusBarIconsBehaviorChanged(hideSilentStatusIcons);
} catch (RemoteException ex) {
Slog.e(TAG, "unable to notify listener "
- + "(hideSilentStatusIcons): " + listener, ex);
+ + "(hideSilentStatusIcons): " + info, ex);
}
});
}
@@ -8877,7 +8877,7 @@ public class NotificationManagerService extends SystemService {
try {
listener.onNotificationPosted(sbnHolder, rankingUpdate);
} catch (RemoteException ex) {
- Slog.e(TAG, "unable to notify listener (posted): " + listener, ex);
+ Slog.e(TAG, "unable to notify listener (posted): " + info, ex);
}
}
@@ -8891,7 +8891,7 @@ public class NotificationManagerService extends SystemService {
try {
listener.onNotificationRemoved(sbnHolder, rankingUpdate, stats, reason);
} catch (RemoteException ex) {
- Slog.e(TAG, "unable to notify listener (removed): " + listener, ex);
+ Slog.e(TAG, "unable to notify listener (removed): " + info, ex);
}
}
@@ -8901,7 +8901,7 @@ public class NotificationManagerService extends SystemService {
try {
listener.onNotificationRankingUpdate(rankingUpdate);
} catch (RemoteException ex) {
- Slog.e(TAG, "unable to notify listener (ranking update): " + listener, ex);
+ Slog.e(TAG, "unable to notify listener (ranking update): " + info, ex);
}
}
@@ -8910,7 +8910,7 @@ public class NotificationManagerService extends SystemService {
try {
listener.onListenerHintsChanged(hints);
} catch (RemoteException ex) {
- Slog.e(TAG, "unable to notify listener (listener hints): " + listener, ex);
+ Slog.e(TAG, "unable to notify listener (listener hints): " + info, ex);
}
}
@@ -8920,7 +8920,7 @@ public class NotificationManagerService extends SystemService {
try {
listener.onInterruptionFilterChanged(interruptionFilter);
} catch (RemoteException ex) {
- Slog.e(TAG, "unable to notify listener (interruption filter): " + listener, ex);
+ Slog.e(TAG, "unable to notify listener (interruption filter): " + info, ex);
}
}
@@ -8931,7 +8931,7 @@ public class NotificationManagerService extends SystemService {
try {
listener.onNotificationChannelModification(pkg, user, channel, modificationType);
} catch (RemoteException ex) {
- Slog.e(TAG, "unable to notify listener (channel changed): " + listener, ex);
+ Slog.e(TAG, "unable to notify listener (channel changed): " + info, ex);
}
}
@@ -8942,7 +8942,7 @@ public class NotificationManagerService extends SystemService {
try {
listener.onNotificationChannelGroupModification(pkg, user, group, modificationType);
} catch (RemoteException ex) {
- Slog.e(TAG, "unable to notify listener (channel group changed): " + listener, ex);
+ Slog.e(TAG, "unable to notify listener (channel group changed): " + info, ex);
}
}
diff --git a/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java b/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java
index 01f29dcd4ffe..00779ec6e45c 100644
--- a/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java
+++ b/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java
@@ -67,6 +67,7 @@ import java.security.SecureRandom;
import java.time.Instant;
import java.time.temporal.ChronoUnit;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
@@ -82,6 +83,7 @@ import java.util.concurrent.TimeUnit;
class RollbackManagerServiceImpl extends IRollbackManager.Stub {
private static final String TAG = "RollbackManager";
+ private static final boolean LOCAL_LOGV = false;
// Rollbacks expire after 14 days.
private static final long DEFAULT_ROLLBACK_LIFETIME_DURATION_MILLIS =
@@ -220,6 +222,9 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
if (Intent.ACTION_CANCEL_ENABLE_ROLLBACK.equals(intent.getAction())) {
int token = intent.getIntExtra(
PackageManagerInternal.EXTRA_ENABLE_ROLLBACK_TOKEN, -1);
+ if (LOCAL_LOGV) {
+ Slog.v(TAG, "broadcast=ACTION_CANCEL_ENABLE_ROLLBACK token=" + token);
+ }
synchronized (mLock) {
for (NewRollback rollback : mNewRollbacks) {
if (rollback.hasToken(token)) {
@@ -269,10 +274,17 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
String action = intent.getAction();
if (Intent.ACTION_PACKAGE_REPLACED.equals(action)) {
String packageName = intent.getData().getSchemeSpecificPart();
+ if (LOCAL_LOGV) {
+ Slog.v(TAG, "broadcast=ACTION_PACKAGE_REPLACED" + " pkg=" + packageName);
+ }
onPackageReplaced(packageName);
}
if (Intent.ACTION_PACKAGE_FULLY_REMOVED.equals(action)) {
String packageName = intent.getData().getSchemeSpecificPart();
+ if (LOCAL_LOGV) {
+ Slog.v(TAG, "broadcast=ACTION_PACKAGE_FULLY_REMOVED"
+ + " pkg=" + packageName);
+ }
onPackageFullyRemoved(packageName);
}
}
@@ -359,7 +371,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
*/
private void commitRollbackInternal(int rollbackId, List<VersionedPackage> causePackages,
String callerPackageName, IntentSender statusReceiver) {
- Slog.i(TAG, "Initiating rollback");
+ Slog.i(TAG, "commitRollback id=" + rollbackId + " caller=" + callerPackageName);
Rollback rollback = getRollbackForId(rollbackId);
if (rollback == null) {
@@ -444,6 +456,9 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
}
void onUnlockUser(int userId) {
+ if (LOCAL_LOGV) {
+ Slog.v(TAG, "onUnlockUser id=" + userId);
+ }
// In order to ensure that no package begins running while a backup or restore is taking
// place, onUnlockUser must remain blocked until all pending backups and restores have
// completed.
@@ -611,6 +626,9 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
if (!now.isBefore(
rollbackTimestamp
.plusMillis(mRollbackLifetimeDurationInMillis))) {
+ if (LOCAL_LOGV) {
+ Slog.v(TAG, "runExpiration id=" + rollback.info.getRollbackId());
+ }
iter.remove();
rollback.delete(mAppDataRollbackHelper);
} else if (oldest == null || oldest.isAfter(rollbackTimestamp)) {
@@ -675,6 +693,10 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
*/
private boolean enableRollback(
int installFlags, File newPackageCodePath, @UserIdInt int user, int token) {
+ if (LOCAL_LOGV) {
+ Slog.v(TAG, "enableRollback user=" + user + " token=" + token
+ + " path=" + newPackageCodePath.getAbsolutePath());
+ }
// Find the session id associated with this install.
// TODO: It would be nice if package manager or package installer told
@@ -838,6 +860,10 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
}
private void snapshotUserDataInternal(String packageName, int[] userIds) {
+ if (LOCAL_LOGV) {
+ Slog.v(TAG, "snapshotUserData pkg=" + packageName
+ + " users=" + Arrays.toString(userIds));
+ }
synchronized (mLock) {
// staged installs
for (int i = 0; i < mRollbacks.size(); i++) {
@@ -854,6 +880,10 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
private void restoreUserDataInternal(
String packageName, int[] userIds, int appId, String seInfo) {
+ if (LOCAL_LOGV) {
+ Slog.v(TAG, "restoreUserData pkg=" + packageName
+ + " users=" + Arrays.toString(userIds));
+ }
synchronized (mLock) {
for (int i = 0; i < mRollbacks.size(); ++i) {
Rollback rollback = mRollbacks.get(i);
@@ -1041,6 +1071,9 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
@Override
public void onFinished(int sessionId, boolean success) {
+ if (LOCAL_LOGV) {
+ Slog.v(TAG, "SessionCallback.onFinished id=" + sessionId + " success=" + success);
+ }
NewRollback newRollback;
synchronized (mLock) {
newRollback = getNewRollbackForPackageSessionLocked(sessionId);
@@ -1070,6 +1103,10 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
*/
private Rollback completeEnableRollback(NewRollback newRollback, boolean success) {
Rollback rollback = newRollback.rollback;
+ if (LOCAL_LOGV) {
+ Slog.v(TAG, "completeEnableRollback id="
+ + rollback.info.getRollbackId() + " success=" + success);
+ }
if (!success) {
// The install session was aborted, clean up the pending install.
rollback.delete(mAppDataRollbackHelper);
@@ -1108,6 +1145,9 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
@GuardedBy("rollback.getLock")
private void makeRollbackAvailable(Rollback rollback) {
+ if (LOCAL_LOGV) {
+ Slog.v(TAG, "makeRollbackAvailable id=" + rollback.info.getRollbackId());
+ }
rollback.makeAvailable();
// TODO(zezeozue): Provide API to explicitly start observing instead
@@ -1280,6 +1320,11 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
final Rollback rollback;
int parentSessionId = parentSession.getSessionId();
+ if (LOCAL_LOGV) {
+ Slog.v(TAG, "createNewRollback id=" + rollbackId
+ + " user=" + userId + " installer=" + installerPackageName);
+ }
+
if (parentSession.isStaged()) {
rollback = mRollbackStore.createStagedRollback(rollbackId, parentSessionId, userId,
installerPackageName);
diff --git a/services/core/java/com/android/server/wm/ActivityDisplay.java b/services/core/java/com/android/server/wm/ActivityDisplay.java
index 45e3c689e81e..db94cf171ec5 100644
--- a/services/core/java/com/android/server/wm/ActivityDisplay.java
+++ b/services/core/java/com/android/server/wm/ActivityDisplay.java
@@ -73,7 +73,9 @@ import android.util.proto.ProtoOutputStream;
import android.view.Display;
import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.util.function.pooled.PooledConsumer;
import com.android.internal.util.function.pooled.PooledLambda;
+import com.android.internal.util.function.pooled.PooledPredicate;
import com.android.server.protolog.common.ProtoLog;
import java.io.PrintWriter;
@@ -617,7 +619,7 @@ class ActivityDisplay extends ConfigurationContainer<ActivityStack> {
continue;
}
- stack.findTaskLocked(r, mTmpFindTaskResult);
+ mTmpFindTaskResult.process(r, stack);
// It is possible to have tasks in multiple stacks with the same root affinity, so
// we should keep looking after finding an affinity match to see if there is a
// better match in another stack. Also, task affinity isn't a good enough reason
@@ -1190,12 +1192,11 @@ class ActivityDisplay extends ConfigurationContainer<ActivityStack> {
}
boolean isUidPresent(int uid) {
- for (ActivityStack stack : mStacks) {
- if (stack.isUidPresent(uid)) {
- return true;
- }
- }
- return false;
+ final PooledPredicate p = PooledLambda.obtainPredicate(
+ ActivityRecord::isUid, PooledLambda.__(ActivityRecord.class), uid);
+ final boolean isUidPresent = mDisplayContent.getActivity(p) != null;
+ p.recycle();
+ return isUidPresent;
}
/**
@@ -1291,12 +1292,16 @@ class ActivityDisplay extends ConfigurationContainer<ActivityStack> {
/** Update and get all UIDs that are present on the display and have access to it. */
IntArray getPresentUIDs() {
mDisplayAccessUIDs.clear();
- for (ActivityStack stack : mStacks) {
- stack.getPresentUIDs(mDisplayAccessUIDs);
- }
+ final PooledConsumer c = PooledLambda.obtainConsumer(ActivityDisplay::addActivityUid,
+ PooledLambda.__(ActivityRecord.class), mDisplayAccessUIDs);
+ mDisplayContent.forAllActivities(c);
+ c.recycle();
return mDisplayAccessUIDs;
}
+ private static void addActivityUid(ActivityRecord r, IntArray uids) {
+ uids.add(r.getUid());
+ }
/**
* Checks if system decorations should be shown on this display.
*
@@ -1449,22 +1454,16 @@ class ActivityDisplay extends ConfigurationContainer<ActivityStack> {
return null;
}
- final ArrayList<Task> tasks = mHomeStack.getAllTasks();
- for (int taskNdx = tasks.size() - 1; taskNdx >= 0; --taskNdx) {
- final Task task = tasks.get(taskNdx);
- if (!task.isActivityTypeHome()) {
- continue;
- }
+ final PooledPredicate p = PooledLambda.obtainPredicate(
+ ActivityDisplay::isHomeActivityForUser, PooledLambda.__(ActivityRecord.class),
+ userId);
+ final ActivityRecord r = mHomeStack.getActivity(p);
+ p.recycle();
+ return r;
+ }
- for (int activityNdx = task.getChildCount() - 1; activityNdx >= 0; --activityNdx) {
- final ActivityRecord r = task.getChildAt(activityNdx);
- if (r.isActivityTypeHome()
- && ((userId == UserHandle.USER_ALL) || (r.mUserId == userId))) {
- return r;
- }
- }
- }
- return null;
+ private static boolean isHomeActivityForUser(ActivityRecord r, int userId) {
+ return r.isActivityTypeHome() && (userId == UserHandle.USER_ALL || r.mUserId == userId);
}
boolean isSleeping() {
diff --git a/services/core/java/com/android/server/wm/ActivityMetricsLogger.java b/services/core/java/com/android/server/wm/ActivityMetricsLogger.java
index 9fa5d9f15f3e..a593ef846f00 100644
--- a/services/core/java/com/android/server/wm/ActivityMetricsLogger.java
+++ b/services/core/java/com/android/server/wm/ActivityMetricsLogger.java
@@ -546,13 +546,7 @@ class ActivityMetricsLogger {
/** @return {@code true} if the given task has an activity will be drawn. */
private static boolean hasActivityToBeDrawn(Task t) {
- for (int i = t.getChildCount() - 1; i >= 0; --i) {
- final ActivityRecord r = t.getChildAt(i);
- if (r.mVisibleRequested && !r.mDrawn && !r.finishing) {
- return true;
- }
- }
- return false;
+ return t.forAllActivities((r) -> r.mVisibleRequested && !r.mDrawn && !r.finishing);
}
private void checkVisibility(Task t, ActivityRecord r) {
diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java
index b8b5efdea692..6af50250e0ab 100644
--- a/services/core/java/com/android/server/wm/ActivityRecord.java
+++ b/services/core/java/com/android/server/wm/ActivityRecord.java
@@ -301,6 +301,9 @@ import com.android.internal.app.ResolverActivity;
import com.android.internal.content.ReferrerIntent;
import com.android.internal.util.ToBooleanFunction;
import com.android.internal.util.XmlUtils;
+import com.android.internal.util.function.pooled.PooledConsumer;
+import com.android.internal.util.function.pooled.PooledFunction;
+import com.android.internal.util.function.pooled.PooledLambda;
import com.android.server.AttributeCache;
import com.android.server.LocalServices;
import com.android.server.am.AppTimeTracker;
@@ -695,12 +698,6 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
}
}
- void dump(PrintWriter pw, String prefix) {
- }
-
- /**
- * Copied from old AppWindowToken.
- */
@Override
void dump(PrintWriter pw, String prefix, boolean dumpAll) {
final long now = SystemClock.uptimeMillis();
@@ -940,6 +937,10 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
}
}
+ void setAppTimeTracker(AppTimeTracker att) {
+ appTimeTracker = att;
+ }
+
/** Update the saved state of an activity. */
void setSavedState(@Nullable Bundle savedState) {
mIcicle = savedState;
@@ -1167,6 +1168,15 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
super.onParentChanged(newParent, oldParent);
+ if (isPersistable()) {
+ if (oldTask != null) {
+ mAtmService.notifyTaskPersisterLocked(oldTask, false);
+ }
+ if (newTask != null) {
+ mAtmService.notifyTaskPersisterLocked(newTask, false);
+ }
+ }
+
if (oldParent == null && newParent != null) {
// First time we are adding the activity to the system.
mVoiceInteraction = newTask.voiceSession != null;
@@ -1261,12 +1271,8 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
if (prevDc.mFocusedApp == this) {
prevDc.setFocusedApp(null);
- final ActivityStack stack = dc.getTopStack();
- if (stack != null) {
- final Task task = stack.getTopChild();
- if (task != null && task.getTopChild() == this) {
- dc.setFocusedApp(this);
- }
+ if (dc.getTopMostActivity() == this) {
+ dc.setFocusedApp(this);
}
}
@@ -2212,7 +2218,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
OP_PICTURE_IN_PICTURE, info.applicationInfo.uid, packageName) == MODE_ALLOWED;
}
- boolean isAlwaysFocusable() {
+ private boolean isAlwaysFocusable() {
return (info.flags & FLAG_ALWAYS_FOCUSABLE) != 0;
}
@@ -2269,23 +2275,28 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
return true;
}
+ void finishIfSubActivity(ActivityRecord parent, String otherResultWho, int otherRequestCode) {
+ if (resultTo != parent
+ || requestCode != otherRequestCode
+ || !Objects.equals(resultWho, otherResultWho)) return;
+
+ finishIfPossible("request-sub", false /* oomAdj */);
+ }
+
/** Finish all activities in the task with the same affinity as this one. */
- void finishActivityAffinity() {
- final ArrayList<ActivityRecord> activities = task.mChildren;
- for (int index = activities.indexOf(this); index >= 0; --index) {
- final ActivityRecord cur = activities.get(index);
- if (!Objects.equals(cur.taskAffinity, taskAffinity)) {
- break;
- }
- cur.finishIfPossible("request-affinity", true /* oomAdj */);
- }
+ boolean finishIfSameAffinity(ActivityRecord r) {
+ // End search once we get to the activity that doesn't have the same affinity.
+ if (!Objects.equals(r.taskAffinity, taskAffinity)) return true;
+
+ r.finishIfPossible("request-affinity", true /* oomAdj */);
+ return false;
}
/**
* Sets the result for activity that started this one, clears the references to activities
* started for result from this one, and clears new intents.
*/
- void finishActivityResults(int resultCode, Intent resultData) {
+ private void finishActivityResults(int resultCode, Intent resultData) {
// Send the result if needed
if (resultTo != null) {
if (DEBUG_RESULTS) {
@@ -2384,14 +2395,12 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
final Task task = getTask();
EventLogTags.writeWmFinishActivity(mUserId, System.identityHashCode(this),
task.mTaskId, shortComponentName, reason);
- final ArrayList<ActivityRecord> activities = task.mChildren;
- final int index = activities.indexOf(this);
- if (index < (task.getChildCount() - 1)) {
+ ActivityRecord next = task.getActivityAbove(this);
+ if (next != null) {
if ((intent.getFlags() & Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET) != 0) {
// If the caller asked that this activity (and all above it)
// be cleared when the task is reset, don't lose that information,
// but propagate it up to the next activity.
- final ActivityRecord next = task.getChildAt(index + 1);
next.intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
}
}
@@ -2409,7 +2418,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
} else {
// Only move the next stack to top in its display.
final ActivityDisplay display = stack.getDisplay();
- final ActivityRecord next = display.topRunningActivity();
+ next = display.topRunningActivity();
if (next != null) {
display.positionChildAtTop(next.getActivityStack(),
false /* includingParents */, "finish-display-top");
@@ -2419,7 +2428,8 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
finishActivityResults(resultCode, resultData);
- final boolean endTask = index <= 0 && !task.isClearingToReuseTask();
+ final boolean endTask = task.getActivityBelow(this) == null
+ && !task.isClearingToReuseTask();
final int transit = endTask ? TRANSIT_TASK_CLOSE : TRANSIT_ACTIVITY_CLOSE;
if (isState(RESUMED)) {
if (endTask) {
@@ -2479,16 +2489,13 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
// sync with the activity visibility being set for this finishing activity above.
// In this case, we can set the visibility of all the task overlay activities when
// we detect the last one is finishing to keep them in sync.
- if (task.onlyHasTaskOverlayActivities(true /* excludeFinishing */)) {
- for (int i = task.getChildCount() - 1; i >= 0 ; --i) {
- final ActivityRecord taskOverlay = task.getChildAt(i);
- if (!taskOverlay.mTaskOverlay) {
- continue;
- }
- taskOverlay.prepareActivityHideTransitionAnimation(transit);
- }
+ if (task.onlyHasTaskOverlayActivities(false /* includeFinishing */)) {
+ final PooledConsumer c = PooledLambda.obtainConsumer(
+ ActivityRecord::prepareActivityHideTransitionAnimationIfOvarlay,
+ PooledLambda.__(ActivityRecord.class), transit);
+ task.forAllActivities(c);
+ c.recycle();
}
-
return removedActivity ? FINISH_RESULT_REMOVED : FINISH_RESULT_REQUESTED;
} else {
if (DEBUG_PAUSE) Slog.v(TAG_PAUSE, "Finish waiting for pause of: " + this);
@@ -2500,6 +2507,12 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
}
}
+ private void prepareActivityHideTransitionAnimationIfOvarlay(int transit) {
+ if (mTaskOverlay) {
+ prepareActivityHideTransitionAnimation(transit);
+ }
+ }
+
private void prepareActivityHideTransitionAnimation(int transit) {
final DisplayContent dc = getDisplay().mDisplayContent;
dc.prepareAppTransition(transit, false);
@@ -3271,15 +3284,16 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
* immediately finishes after, so we have to transfer T to M.
*/
void transferStartingWindowFromHiddenAboveTokenIfNeeded() {
- for (int i = task.mChildren.size() - 1; i >= 0; i--) {
- final ActivityRecord fromActivity = task.mChildren.get(i);
- if (fromActivity == this) {
- return;
- }
- if (!fromActivity.mVisibleRequested && transferStartingWindow(fromActivity.token)) {
- return;
- }
- }
+ final PooledFunction p = PooledLambda.obtainFunction(ActivityRecord::transferStartingWindow,
+ this, PooledLambda.__(ActivityRecord.class));
+ task.forAllActivities(p);
+ p.recycle();
+ }
+
+ private boolean transferStartingWindow(ActivityRecord fromActivity) {
+ if (fromActivity == this) return true;
+
+ return !fromActivity.mVisibleRequested && transferStartingWindow(fromActivity.token);
}
void checkKeyguardFlagsChanged() {
@@ -3351,7 +3365,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
if (!inPinnedWindowingMode() && (mShowWhenLocked || containsShowWhenLockedWindow())) {
return true;
} else if (mInheritShownWhenLocked) {
- final ActivityRecord r = getActivityBelow();
+ final ActivityRecord r = task.getActivityBelow(this);
return r != null && !r.inPinnedWindowingMode() && (r.mShowWhenLocked
|| r.containsShowWhenLockedWindow());
} else {
@@ -3376,19 +3390,6 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
true /* topToBottom */);
}
- /**
- * @return an {@link ActivityRecord} of the activity below this activity, or {@code null} if no
- * such activity exists.
- */
- @Nullable
- private ActivityRecord getActivityBelow() {
- final int pos = task.mChildren.indexOf(this);
- if (pos == -1) {
- throw new IllegalStateException("Activity not found in its task");
- }
- return pos == 0 ? null : task.getChildAt(pos - 1);
- }
-
WindowState getImeTargetBelowWindow(WindowState w) {
final int index = mChildren.indexOf(w);
if (index > 0) {
@@ -3432,7 +3433,8 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
}
@Override
- boolean forAllActivities(Function<ActivityRecord, Boolean> callback) {
+ boolean forAllActivities(
+ Function<ActivityRecord, Boolean> callback, boolean traverseTopToBottom) {
return callback.apply(this);
}
@@ -3609,7 +3611,9 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
clearOptionsLocked(false /* withAbort */);
} else {
// This will clear the options for all the ActivityRecords for this Task.
- task.clearAllPendingOptions();
+ task.forAllActivities((r) -> {
+ r.clearOptionsLocked(false /* withAbort */);
+ });
}
}
}
@@ -4602,16 +4606,15 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
}
// Check if position in task allows to become paused
- final int positionInTask = task.mChildren.indexOf(this);
- if (positionInTask == -1) {
+ if (!task.hasChild(this)) {
throw new IllegalStateException("Activity not found in its task");
}
- if (positionInTask == task.getChildCount() - 1) {
+ final ActivityRecord activityAbove = task.getActivityAbove(this);
+ if (activityAbove == null) {
// It's the topmost activity in the task - should become resumed now
return true;
}
// Check if activity above is finishing now and this one becomes the topmost in task.
- final ActivityRecord activityAbove = task.getChildAt(positionInTask + 1);
if (activityAbove.finishing) {
return true;
}
@@ -4667,7 +4670,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
stopped = false;
if (isActivityTypeHome()) {
- mStackSupervisor.updateHomeProcess(task.getChildAt(0).app);
+ mStackSupervisor.updateHomeProcess(task.getBottomMostActivity().app);
}
if (nowVisible) {
@@ -5294,6 +5297,10 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
&& mAtmService.mAmInternal.isUserRunning(mUserId, 0 /* flags */));
}
+ boolean canBeTopRunning() {
+ return !finishing && okToShowLocked();
+ }
+
/**
* This method will return true if the activity is either visible, is becoming visible, is
* currently pausing, or is resumed.
@@ -5325,13 +5332,12 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
static int getTaskForActivityLocked(IBinder token, boolean onlyRoot) {
final ActivityRecord r = ActivityRecord.forTokenLocked(token);
- if (r == null) {
+ if (r == null || r.getParent() == null) {
return INVALID_TASK_ID;
}
final Task task = r.task;
- final int activityNdx = task.mChildren.indexOf(r);
- if (activityNdx < 0
- || (onlyRoot && activityNdx > task.findRootIndex(true /* effectiveRoot */))) {
+ if (onlyRoot && r.compareTo(task.getRootActivity(
+ false /*ignoreRelinquishIdentity*/, true /*setToBottomIfNone*/)) > 0) {
return INVALID_TASK_ID;
}
return task.mTaskId;
@@ -7222,6 +7228,10 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
return info.applicationInfo.uid;
}
+ boolean isUid(int uid) {
+ return info.applicationInfo.uid == uid;
+ }
+
int getPid() {
return app != null ? app.getPid() : 0;
}
@@ -7285,13 +7295,8 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
if (task == null) {
return false;
}
- final ActivityRecord rootActivity = task.getRootActivity();
- if (rootActivity != null) {
- return this == rootActivity;
- }
- // No non-finishing activity found. In this case the bottom-most activity is considered to
- // be the root.
- return task.getChildAt(0) == this;
+ final ActivityRecord rootActivity = task.getRootActivity(true);
+ return this == rootActivity;
}
@Override
diff --git a/services/core/java/com/android/server/wm/ActivityStack.java b/services/core/java/com/android/server/wm/ActivityStack.java
index 6ddbb0df2ccc..bb3126b99696 100644
--- a/services/core/java/com/android/server/wm/ActivityStack.java
+++ b/services/core/java/com/android/server/wm/ActivityStack.java
@@ -76,12 +76,10 @@ import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_ALL;
import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_APP;
import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_CLEANUP;
import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_PAUSE;
-import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_RELEASE;
import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_RESULTS;
import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_STACK;
import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_STATES;
import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_SWITCH;
-import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_TASKS;
import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_TRANSITION;
import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_USER_LEAVING;
import static com.android.server.wm.ActivityTaskManagerDebugConfig.POSTFIX_ADD_REMOVE;
@@ -107,7 +105,6 @@ import static com.android.server.wm.BoundsAnimationController.NO_PIP_MODE_CHANGE
import static com.android.server.wm.BoundsAnimationController.SCHEDULE_PIP_MODE_CHANGED_ON_END;
import static com.android.server.wm.BoundsAnimationController.SCHEDULE_PIP_MODE_CHANGED_ON_START;
import static com.android.server.wm.DragResizeMode.DRAG_RESIZE_MODE_DOCKED_DIVIDER;
-import static com.android.server.wm.RootActivityContainer.FindTaskResult;
import static com.android.server.wm.StackProto.ADJUSTED_BOUNDS;
import static com.android.server.wm.StackProto.ADJUSTED_FOR_IME;
import static com.android.server.wm.StackProto.ADJUST_DIVIDER_AMOUNT;
@@ -143,12 +140,10 @@ import android.app.servertransaction.ResumeActivityItem;
import android.content.ComponentName;
import android.content.Intent;
import android.content.pm.ActivityInfo;
-import android.content.pm.ApplicationInfo;
import android.content.res.Configuration;
import android.graphics.Point;
import android.graphics.Rect;
import android.graphics.Region;
-import android.net.Uri;
import android.os.Binder;
import android.os.Debug;
import android.os.Handler;
@@ -162,7 +157,6 @@ import android.os.UserHandle;
import android.service.voice.IVoiceInteractionSession;
import android.util.ArraySet;
import android.util.DisplayMetrics;
-import android.util.IntArray;
import android.util.Log;
import android.util.Slog;
import android.util.proto.ProtoOutputStream;
@@ -178,7 +172,10 @@ import com.android.internal.app.IVoiceInteractor;
import com.android.internal.os.logging.MetricsLoggerWrapper;
import com.android.internal.policy.DividerSnapAlgorithm;
import com.android.internal.policy.DockedDividerUtils;
+import com.android.internal.util.function.pooled.PooledConsumer;
+import com.android.internal.util.function.pooled.PooledFunction;
import com.android.internal.util.function.pooled.PooledLambda;
+import com.android.internal.util.function.pooled.PooledPredicate;
import com.android.server.Watchdog;
import com.android.server.am.ActivityManagerService;
import com.android.server.am.ActivityManagerService.ItemMatcher;
@@ -189,14 +186,12 @@ import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
-import java.util.Set;
import java.util.function.Consumer;
/**
* State and management of a single stack of activities.
*/
-class ActivityStack extends WindowContainer<Task> implements BoundsAnimationTarget,
- ConfigurationContainerListener {
+class ActivityStack extends WindowContainer<Task> implements BoundsAnimationTarget {
private static final String TAG = TAG_WITH_CLASS_NAME ? "ActivityStack" : TAG_ATM;
static final String TAG_ADD_REMOVE = TAG + POSTFIX_ADD_REMOVE;
private static final String TAG_APP = TAG + POSTFIX_APP;
@@ -499,7 +494,7 @@ class ActivityStack extends WindowContainer<Task> implements BoundsAnimationTarg
case DESTROY_ACTIVITIES_MSG: {
ScheduleDestroyArgs args = (ScheduleDestroyArgs)msg.obj;
synchronized (mService.mGlobalLock) {
- destroyActivitiesLocked(args.mOwner, args.mReason);
+ destroyActivities(args.mOwner, args.mReason);
}
} break;
case TRANSLUCENT_TIMEOUT_MSG: {
@@ -514,13 +509,226 @@ class ActivityStack extends WindowContainer<Task> implements BoundsAnimationTarg
private static final ResetTargetTaskHelper sResetTargetTaskHelper = new ResetTargetTaskHelper();
private final EnsureActivitiesVisibleHelper mEnsureActivitiesVisibleHelper =
new EnsureActivitiesVisibleHelper(this);
+ private final EnsureVisibleActivitiesConfigHelper mEnsureVisibleActivitiesConfigHelper =
+ new EnsureVisibleActivitiesConfigHelper();
+ private class EnsureVisibleActivitiesConfigHelper {
+ private boolean mUpdateConfig;
+ private boolean mPreserveWindow;
+ private boolean mBehindFullscreen;
- int numActivities() {
- int count = 0;
- for (int taskNdx = getChildCount() - 1; taskNdx >= 0; --taskNdx) {
- count += getChildAt(taskNdx).getChildCount();
+ void reset(boolean preserveWindow) {
+ mPreserveWindow = preserveWindow;
+ mUpdateConfig = false;
+ mBehindFullscreen = false;
+ }
+
+ void process(ActivityRecord start, boolean preserveWindow) {
+ if (start == null || !start.mVisibleRequested) {
+ return;
+ }
+ reset(preserveWindow);
+
+ final PooledFunction f = PooledLambda.obtainFunction(
+ EnsureVisibleActivitiesConfigHelper::processActivity, this,
+ PooledLambda.__(ActivityRecord.class));
+ forAllActivities(f, start.getTask(), true /*includeBoundary*/,
+ true /*traverseTopToBottom*/);
+ f.recycle();
+
+ if (mUpdateConfig) {
+ // Ensure the resumed state of the focus activity if we updated the configuration of
+ // any activity.
+ mRootActivityContainer.resumeFocusedStacksTopActivities();
+ }
+ }
+
+ boolean processActivity(ActivityRecord r) {
+ mUpdateConfig |= r.ensureActivityConfiguration(0 /*globalChanges*/, mPreserveWindow);
+ mBehindFullscreen |= r.occludesParent();
+ return mBehindFullscreen;
+ }
+ }
+
+ private final CheckBehindFullscreenActivityHelper mCheckBehindFullscreenActivityHelper =
+ new CheckBehindFullscreenActivityHelper();
+ private class CheckBehindFullscreenActivityHelper {
+ private boolean mAboveTop;
+ private boolean mBehindFullscreenActivity;
+ private ActivityRecord mToCheck;
+ private Consumer<ActivityRecord> mHandleBehindFullscreenActivity;
+ private boolean mHandlingOccluded;
+
+ private void reset(ActivityRecord toCheck,
+ Consumer<ActivityRecord> handleBehindFullscreenActivity) {
+ mToCheck = toCheck;
+ mHandleBehindFullscreenActivity = handleBehindFullscreenActivity;
+ mAboveTop = true;
+ mBehindFullscreenActivity = false;
+
+ if (!shouldBeVisible(null)) {
+ // The stack is not visible, so no activity in it should be displaying a starting
+ // window. Mark all activities below top and behind fullscreen.
+ mAboveTop = false;
+ mBehindFullscreenActivity = true;
+ }
+
+ mHandlingOccluded = mToCheck == null && mHandleBehindFullscreenActivity != null;
+ }
+
+ boolean process(ActivityRecord toCheck,
+ Consumer<ActivityRecord> handleBehindFullscreenActivity) {
+ reset(toCheck, handleBehindFullscreenActivity);
+
+ if (!mHandlingOccluded && mBehindFullscreenActivity) {
+ return true;
+ }
+
+ final ActivityRecord topActivity = topRunningActivityLocked();
+ final PooledFunction f = PooledLambda.obtainFunction(
+ CheckBehindFullscreenActivityHelper::processActivity, this,
+ PooledLambda.__(ActivityRecord.class), topActivity);
+ forAllActivities(f);
+ f.recycle();
+
+ return mBehindFullscreenActivity;
+ }
+
+ private boolean processActivity(ActivityRecord r, ActivityRecord topActivity) {
+ if (mAboveTop) {
+ if (r == topActivity) {
+ if (r == mToCheck) {
+ // It is the top activity in a visible stack.
+ mBehindFullscreenActivity = false;
+ return true;
+ }
+ mAboveTop = false;
+ }
+ mBehindFullscreenActivity |= r.occludesParent();
+ return false;
+ }
+
+ if (mHandlingOccluded) {
+ mHandleBehindFullscreenActivity.accept(r);
+ } else if (r == mToCheck) {
+ return true;
+ } else if (mBehindFullscreenActivity) {
+ // It is occluded before {@param toCheck} is found.
+ return true;
+ }
+ mBehindFullscreenActivity |= r.occludesParent();
+ return false;
+ }
+ }
+
+ // TODO: Can we just loop through WindowProcessController#mActivities instead of doing this?
+ private final RemoveHistoryRecordsForApp mRemoveHistoryRecordsForApp =
+ new RemoveHistoryRecordsForApp();
+ private class RemoveHistoryRecordsForApp {
+ private boolean mHasVisibleActivities;
+ private boolean mIsProcessRemoved;
+ private WindowProcessController mApp;
+ private ArrayList<ActivityRecord> mToRemove = new ArrayList<>();
+
+ boolean process(WindowProcessController app) {
+ mToRemove.clear();
+ mHasVisibleActivities = false;
+ mApp = app;
+ mIsProcessRemoved = app.isRemoved();
+ if (mIsProcessRemoved) {
+ // The package of the died process should be force-stopped, so make its activities
+ // as finishing to prevent the process from being started again if the next top
+ // (or being visible) activity also resides in the same process.
+ app.makeFinishingForProcessRemoved();
+ }
+
+ final PooledConsumer c = PooledLambda.obtainConsumer(
+ RemoveHistoryRecordsForApp::addActivityToRemove, this,
+ PooledLambda.__(ActivityRecord.class));
+ forAllActivities(c);
+ c.recycle();
+
+ while (!mToRemove.isEmpty()) {
+ processActivity(mToRemove.remove(0));
+ }
+
+ mApp = null;
+ return mHasVisibleActivities;
+ }
+
+ private void addActivityToRemove(ActivityRecord r) {
+ if (r.app == mApp) {
+ mToRemove.add(r);
+ }
+ }
+
+ private void processActivity(ActivityRecord r) {
+ if (DEBUG_CLEANUP) Slog.v(TAG_CLEANUP, "Record " + r + ": app=" + r.app);
+
+ if (r.app != mApp) {
+ return;
+ }
+ if (r.isVisible() || r.mVisibleRequested) {
+ // While an activity launches a new activity, it's possible that the old
+ // activity is already requested to be hidden (mVisibleRequested=false), but
+ // this visibility is not yet committed, so isVisible()=true.
+ mHasVisibleActivities = true;
+ }
+ final boolean remove;
+ if ((r.mRelaunchReason == RELAUNCH_REASON_WINDOWING_MODE_RESIZE
+ || r.mRelaunchReason == RELAUNCH_REASON_FREE_RESIZE)
+ && r.launchCount < 3 && !r.finishing) {
+ // If the process crashed during a resize, always try to relaunch it, unless
+ // it has failed more than twice. Skip activities that's already finishing
+ // cleanly by itself.
+ remove = false;
+ } else if ((!r.hasSavedState() && !r.stateNotNeeded
+ && !r.isState(ActivityState.RESTARTING_PROCESS)) || r.finishing) {
+ // Don't currently have state for the activity, or
+ // it is finishing -- always remove it.
+ remove = true;
+ } else if (!r.mVisibleRequested && r.launchCount > 2
+ && r.lastLaunchTime > (SystemClock.uptimeMillis() - 60000)) {
+ // We have launched this activity too many times since it was
+ // able to run, so give up and remove it.
+ // (Note if the activity is visible, we don't remove the record.
+ // We leave the dead window on the screen but the process will
+ // not be restarted unless user explicitly tap on it.)
+ remove = true;
+ } else {
+ // The process may be gone, but the activity lives on!
+ remove = false;
+ }
+ if (remove) {
+ if (DEBUG_ADD_REMOVE || DEBUG_CLEANUP) Slog.i(TAG_ADD_REMOVE,
+ "Removing activity " + r + " from stack "
+ + ": hasSavedState=" + r.hasSavedState()
+ + " stateNotNeeded=" + r.stateNotNeeded
+ + " finishing=" + r.finishing
+ + " state=" + r.getState() + " callers=" + Debug.getCallers(5));
+ if (!r.finishing || mIsProcessRemoved) {
+ Slog.w(TAG, "Force removing " + r + ": app died, no saved state");
+ EventLogTags.writeWmFinishActivity(r.mUserId,
+ System.identityHashCode(r), r.getTask().mTaskId,
+ r.shortComponentName, "proc died without state saved");
+ }
+ } else {
+ // We have the current state for this activity, so
+ // it can be restarted later when needed.
+ if (DEBUG_ALL) Slog.v(TAG, "Keeping entry, setting app to null");
+ if (DEBUG_APP) Slog.v(TAG_APP,
+ "Clearing app during removeHistory for activity " + r);
+ r.app = null;
+ // Set nowVisible to previous visible state. If the app was visible while
+ // it died, we leave the dead window on screen so it's basically visible.
+ // This is needed when user later tap on the dead window, we need to stop
+ // other apps when user transfers focus to the restarted activity.
+ r.nowVisible = r.mVisibleRequested;
+ }
+ r.cleanUp(true /* cleanServices */, true /* setState */);
+ if (remove) {
+ r.removeFromHistory("appDied");
+ }
}
- return count;
}
ActivityStack(ActivityDisplay display, int stackId, ActivityStackSupervisor supervisor,
@@ -941,7 +1149,7 @@ class ActivityStack extends WindowContainer<Task> implements BoundsAnimationTarg
}
}
- boolean updateBoundsAllowed(Rect bounds) {
+ private boolean updateBoundsAllowed(Rect bounds) {
if (!mUpdateBoundsDeferred) {
return true;
}
@@ -954,7 +1162,7 @@ class ActivityStack extends WindowContainer<Task> implements BoundsAnimationTarg
return false;
}
- boolean updateDisplayedBoundsAllowed(Rect bounds) {
+ private boolean updateDisplayedBoundsAllowed(Rect bounds) {
if (!mUpdateBoundsDeferred) {
return true;
}
@@ -971,47 +1179,29 @@ class ActivityStack extends WindowContainer<Task> implements BoundsAnimationTarg
return topRunningActivityLocked(false /* focusableOnly */);
}
- void getAllRunningVisibleActivitiesLocked(ArrayList<ActivityRecord> outActivities) {
- outActivities.clear();
- for (int taskNdx = getChildCount() - 1; taskNdx >= 0; --taskNdx) {
- getChildAt(taskNdx).getAllRunningVisibleActivitiesLocked(outActivities);
- }
- }
-
ActivityRecord topRunningActivityLocked(boolean focusableOnly) {
- for (int taskNdx = getChildCount() - 1; taskNdx >= 0; --taskNdx) {
- ActivityRecord r = getChildAt(taskNdx).topRunningActivityLocked();
- if (r != null && (!focusableOnly || r.isFocusable())) {
- return r;
- }
+ // Split into 2 to avoid object creation due to variable capture.
+ if (focusableOnly) {
+ return getActivity((r) -> r.canBeTopRunning() && r.isFocusable());
+ } else {
+ return getActivity(ActivityRecord::canBeTopRunning);
}
- return null;
}
- ActivityRecord topRunningNonOverlayTaskActivity() {
- for (int taskNdx = getChildCount() - 1; taskNdx >= 0; --taskNdx) {
- final Task task = getChildAt(taskNdx);
- for (int activityNdx = task.getChildCount() - 1; activityNdx >= 0; --activityNdx) {
- final ActivityRecord r = task.getChildAt(activityNdx);
- if (!r.finishing && !r.mTaskOverlay) {
- return r;
- }
- }
- }
- return null;
+ private ActivityRecord topRunningNonOverlayTaskActivity() {
+ return getActivity((r) -> (r.canBeTopRunning() && !r.mTaskOverlay));
}
ActivityRecord topRunningNonDelayedActivityLocked(ActivityRecord notTop) {
- for (int taskNdx = getChildCount() - 1; taskNdx >= 0; --taskNdx) {
- final Task task = getChildAt(taskNdx);
- for (int activityNdx = task.getChildCount() - 1; activityNdx >= 0; --activityNdx) {
- final ActivityRecord r = task.getChildAt(activityNdx);
- if (!r.finishing && !r.delayedResume && r != notTop && r.okToShowLocked()) {
- return r;
- }
- }
- }
- return null;
+ final PooledPredicate p = PooledLambda.obtainPredicate(ActivityStack::isTopRunningNonDelayed
+ , PooledLambda.__(ActivityRecord.class), notTop);
+ final ActivityRecord r = getActivity(p);
+ p.recycle();
+ return r;
+ }
+
+ private static boolean isTopRunningNonDelayed(ActivityRecord r, ActivityRecord notTop) {
+ return !r.delayedResume && r != notTop && r.canBeTopRunning();
}
/**
@@ -1024,30 +1214,19 @@ class ActivityStack extends WindowContainer<Task> implements BoundsAnimationTarg
* @return Returns the HistoryRecord of the next activity on the stack.
*/
final ActivityRecord topRunningActivityLocked(IBinder token, int taskId) {
- for (int taskNdx = getChildCount() - 1; taskNdx >= 0; --taskNdx) {
- Task task = getChildAt(taskNdx);
- if (task.mTaskId == taskId) {
- continue;
- }
- for (int activityNdx = task.getChildCount() - 1; activityNdx >= 0; --activityNdx) {
- final ActivityRecord r = task.getChildAt(activityNdx);
- // Note: the taskId check depends on real taskId fields being non-zero
- if (!r.finishing && (token != r.appToken) && r.okToShowLocked()) {
- return r;
- }
- }
- }
- return null;
+ final PooledPredicate p = PooledLambda.obtainPredicate(ActivityStack::isTopRunning,
+ PooledLambda.__(ActivityRecord.class), taskId, token);
+ final ActivityRecord r = getActivity(p);
+ p.recycle();
+ return r;
+ }
+
+ private static boolean isTopRunning(ActivityRecord r, int taskId, IBinder notTop) {
+ return r.getTask().mTaskId == taskId && r.appToken != notTop && r.canBeTopRunning();
}
ActivityRecord getTopNonFinishingActivity() {
- for (int taskNdx = getChildCount() - 1; taskNdx >= 0; --taskNdx) {
- final ActivityRecord r = getChildAt(taskNdx).getTopNonFinishingActivity();
- if (r != null) {
- return r;
- }
- }
- return null;
+ return getTopActivity(false /*includeFinishing*/, true /*includeOverlays*/);
}
final Task topTask() {
@@ -1087,35 +1266,6 @@ class ActivityStack extends WindowContainer<Task> implements BoundsAnimationTarg
return null;
}
- boolean isInStackLocked(Task task) {
- return mChildren.contains(task);
- }
-
- /** Checks if there are tasks with specific UID in the stack. */
- boolean isUidPresent(int uid) {
- for (int j = getChildCount() - 1; j >= 0; --j) {
- final Task task = getChildAt(j);
- for (int i = task.getChildCount() - 1; i >= 0 ; --i) {
- final ActivityRecord r = task.getChildAt(i);
- if (r.getUid() == uid) {
- return true;
- }
- }
- }
- return false;
- }
-
- /** Get all UIDs that are present in the stack. */
- void getPresentUIDs(IntArray presentUIDs) {
- for (int j = getChildCount() - 1; j >= 0; --j) {
- final Task task = getChildAt(j);
- for (int i = task.getChildCount() - 1; i >= 0 ; --i) {
- final ActivityRecord r = task.getChildAt(i);
- presentUIDs.add(r.getUid());
- }
- }
- }
-
/** @return true if the stack can only contain one task */
boolean isSingleTaskInstance() {
final ActivityDisplay display = getDisplay();
@@ -1232,138 +1382,6 @@ class ActivityStack extends WindowContainer<Task> implements BoundsAnimationTarg
return display != null && !display.isRemoved();
}
- /**
- * Returns the top activity in any existing task matching the given Intent in the input result.
- * Returns null if no such task is found.
- */
- void findTaskLocked(ActivityRecord target, FindTaskResult result) {
- Intent intent = target.intent;
- ActivityInfo info = target.info;
- ComponentName cls = intent.getComponent();
- if (info.targetActivity != null) {
- cls = new ComponentName(info.packageName, info.targetActivity);
- }
- final int userId = UserHandle.getUserId(info.applicationInfo.uid);
- boolean isDocument = intent != null & intent.isDocument();
- // If documentData is non-null then it must match the existing task data.
- Uri documentData = isDocument ? intent.getData() : null;
-
- if (DEBUG_TASKS) Slog.d(TAG_TASKS, "Looking for task of " + target + " in " + this);
- for (int taskNdx = getChildCount() - 1; taskNdx >= 0; --taskNdx) {
- final Task task = getChildAt(taskNdx);
- if (task.voiceSession != null) {
- // We never match voice sessions; those always run independently.
- if (DEBUG_TASKS) Slog.d(TAG_TASKS, "Skipping " + task + ": voice session");
- continue;
- }
- if (task.mUserId != userId) {
- // Looking for a different task.
- if (DEBUG_TASKS) Slog.d(TAG_TASKS, "Skipping " + task + ": different user");
- continue;
- }
-
- // Overlays should not be considered as the task's logical top activity.
- final ActivityRecord r = task.getTopNonFinishingActivity(false /* includeOverlays */);
- if (r == null || r.finishing || r.mUserId != userId ||
- r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) {
- if (DEBUG_TASKS) Slog.d(TAG_TASKS, "Skipping " + task + ": mismatch root " + r);
- continue;
- }
- if (!r.hasCompatibleActivityType(target)) {
- if (DEBUG_TASKS) Slog.d(TAG_TASKS, "Skipping " + task + ": mismatch activity type");
- continue;
- }
-
- final Intent taskIntent = task.intent;
- final Intent affinityIntent = task.affinityIntent;
- final boolean taskIsDocument;
- final Uri taskDocumentData;
- if (taskIntent != null && taskIntent.isDocument()) {
- taskIsDocument = true;
- taskDocumentData = taskIntent.getData();
- } else if (affinityIntent != null && affinityIntent.isDocument()) {
- taskIsDocument = true;
- taskDocumentData = affinityIntent.getData();
- } else {
- taskIsDocument = false;
- taskDocumentData = null;
- }
-
- if (DEBUG_TASKS) Slog.d(TAG_TASKS, "Comparing existing cls="
- + (task.realActivity != null ? task.realActivity.flattenToShortString() : "")
- + "/aff=" + r.getTask().rootAffinity + " to new cls="
- + intent.getComponent().flattenToShortString() + "/aff=" + info.taskAffinity);
- // TODO Refactor to remove duplications. Check if logic can be simplified.
- if (task.realActivity != null && task.realActivity.compareTo(cls) == 0
- && Objects.equals(documentData, taskDocumentData)) {
- if (DEBUG_TASKS) Slog.d(TAG_TASKS, "Found matching class!");
- //dump();
- if (DEBUG_TASKS) Slog.d(TAG_TASKS,
- "For Intent " + intent + " bringing to top: " + r.intent);
- result.mRecord = r;
- result.mIdealMatch = true;
- break;
- } else if (affinityIntent != null && affinityIntent.getComponent() != null &&
- affinityIntent.getComponent().compareTo(cls) == 0 &&
- Objects.equals(documentData, taskDocumentData)) {
- if (DEBUG_TASKS) Slog.d(TAG_TASKS, "Found matching class!");
- //dump();
- if (DEBUG_TASKS) Slog.d(TAG_TASKS,
- "For Intent " + intent + " bringing to top: " + r.intent);
- result.mRecord = r;
- result.mIdealMatch = true;
- break;
- } else if (!isDocument && !taskIsDocument
- && result.mRecord == null && task.rootAffinity != null) {
- if (task.rootAffinity.equals(target.taskAffinity)) {
- if (DEBUG_TASKS) Slog.d(TAG_TASKS, "Found matching affinity candidate!");
- // It is possible for multiple tasks to have the same root affinity especially
- // if they are in separate stacks. We save off this candidate, but keep looking
- // to see if there is a better candidate.
- result.mRecord = r;
- result.mIdealMatch = false;
- }
- } else if (DEBUG_TASKS) Slog.d(TAG_TASKS, "Not a match: " + task);
- }
- }
-
- /**
- * Returns the first activity (starting from the top of the stack) that
- * is the same as the given activity. Returns null if no such activity
- * is found.
- */
- ActivityRecord findActivityLocked(Intent intent, ActivityInfo info,
- boolean compareIntentFilters) {
- ComponentName cls = intent.getComponent();
- if (info.targetActivity != null) {
- cls = new ComponentName(info.packageName, info.targetActivity);
- }
- final int userId = UserHandle.getUserId(info.applicationInfo.uid);
-
- for (int taskNdx = getChildCount() - 1; taskNdx >= 0; --taskNdx) {
- final Task task = getChildAt(taskNdx);
- for (int activityNdx = task.getChildCount() - 1; activityNdx >= 0; --activityNdx) {
- final ActivityRecord r = task.getChildAt(activityNdx);
- if (!r.okToShowLocked()) {
- continue;
- }
- if (!r.finishing && r.mUserId == userId) {
- if (compareIntentFilters) {
- if (r.intent.filterEquals(intent)) {
- return r;
- }
- } else {
- if (r.intent.getComponent().equals(cls)) {
- return r;
- }
- }
- }
- }
- }
-
- return null;
- }
-
// TODO: Should each user have there own stacks?
@Override
void switchUser(int userId) {
@@ -1401,35 +1419,13 @@ class ActivityStack extends WindowContainer<Task> implements BoundsAnimationTarg
void awakeFromSleepingLocked() {
// Ensure activities are no longer sleeping.
- for (int taskNdx = getChildCount() - 1; taskNdx >= 0; --taskNdx) {
- final Task task = getChildAt(taskNdx);
- for (int activityNdx = task.getChildCount() - 1; activityNdx >= 0; --activityNdx) {
- final ActivityRecord r = task.getChildAt(activityNdx);
- r.setSleeping(false);
- }
- }
+ forAllActivities((Consumer<ActivityRecord>) (r) -> r.setSleeping(false));
if (mPausingActivity != null) {
Slog.d(TAG, "awakeFromSleepingLocked: previously pausing activity didn't pause");
activityPausedLocked(mPausingActivity.appToken, true);
}
}
- void updateActivityApplicationInfoLocked(ApplicationInfo aInfo) {
- final String packageName = aInfo.packageName;
- final int userId = UserHandle.getUserId(aInfo.uid);
-
- for (int taskNdx = getChildCount() - 1; taskNdx >= 0; --taskNdx) {
- final Task task = getChildAt(taskNdx);
- for (int activityNdx = task.getChildCount() - 1; activityNdx >= 0; --activityNdx) {
- final ActivityRecord ar = task.getChildAt(activityNdx);
-
- if ((userId == ar.mUserId) && packageName.equals(ar.packageName)) {
- ar.updateApplicationInfo(aInfo);
- }
- }
- }
- }
-
void checkReadyForSleep() {
if (shouldSleepActivities() && goToSleepIfPossible(false /* shuttingDown */)) {
mStackSupervisor.checkReadyForSleepLocked(true /* allowDelay */);
@@ -1495,15 +1491,11 @@ class ActivityStack extends WindowContainer<Task> implements BoundsAnimationTarg
// Make sure any paused or stopped but visible activities are now sleeping.
// This ensures that the activity's onStop() is called.
- for (int taskNdx = getChildCount() - 1; taskNdx >= 0; --taskNdx) {
- final Task task = getChildAt(taskNdx);
- for (int activityNdx = task.getChildCount() - 1; activityNdx >= 0; --activityNdx) {
- final ActivityRecord r = task.getChildAt(activityNdx);
- if (r.isState(STARTED, STOPPING, STOPPED, PAUSED, PAUSING)) {
- r.setSleeping(true);
- }
+ forAllActivities((r) -> {
+ if (r.isState(STARTED, STOPPING, STOPPED, PAUSED, PAUSING)) {
+ r.setSleeping(true);
}
- }
+ });
}
private boolean containsActivityFromStack(List<ActivityRecord> rs) {
@@ -1779,31 +1771,32 @@ class ActivityStack extends WindowContainer<Task> implements BoundsAnimationTarg
if (!isAttached() || mForceHidden) {
return true;
}
- for (int taskNdx = getChildCount() - 1; taskNdx >= 0; --taskNdx) {
- final Task task = getChildAt(taskNdx);
- for (int activityNdx = task.getChildCount() - 1; activityNdx >= 0; --activityNdx) {
- final ActivityRecord r = task.getChildAt(activityNdx);
+ final PooledPredicate p = PooledLambda.obtainPredicate(ActivityStack::isOpaqueActivity,
+ PooledLambda.__(ActivityRecord.class), starting);
+ final ActivityRecord opaque = getActivity(p);
+ p.recycle();
+ return opaque == null;
+ }
- if (r.finishing) {
- // We don't factor in finishing activities when determining translucency since
- // they will be gone soon.
- continue;
- }
+ private static boolean isOpaqueActivity(ActivityRecord r, ActivityRecord starting) {
+ if (r.finishing) {
+ // We don't factor in finishing activities when determining translucency since
+ // they will be gone soon.
+ return false;
+ }
- if (!r.visibleIgnoringKeyguard && r != starting) {
- // Also ignore invisible activities that are not the currently starting
- // activity (about to be visible).
- continue;
- }
+ if (!r.visibleIgnoringKeyguard && r != starting) {
+ // Also ignore invisible activities that are not the currently starting
+ // activity (about to be visible).
+ return false;
+ }
- if (r.occludesParent() || r.hasWallpaper) {
- // Stack isn't translucent if it has at least one fullscreen activity
- // that is visible.
- return false;
- }
- }
+ if (r.occludesParent() || r.hasWallpaper) {
+ // Stack isn't translucent if it has at least one fullscreen activity
+ // that is visible.
+ return true;
}
- return true;
+ return false;
}
boolean isTopStackOnDisplay() {
@@ -1958,20 +1951,6 @@ class ActivityStack extends WindowContainer<Task> implements BoundsAnimationTarg
: STACK_VISIBILITY_VISIBLE;
}
- final int rankTaskLayers(int baseLayer) {
- int layer = 0;
- for (int taskNdx = getChildCount() - 1; taskNdx >= 0; --taskNdx) {
- final Task task = getChildAt(taskNdx);
- ActivityRecord r = task.topRunningActivityLocked();
- if (r == null || r.finishing || !r.mVisibleRequested) {
- task.mLayerRank = -1;
- } else {
- task.mLayerRank = baseLayer + layer++;
- }
- }
- return layer;
- }
-
/**
* Make sure that all activities that need to be visible in the stack (that is, they
* currently can be seen by the user) actually are and update their configuration.
@@ -2006,12 +1985,6 @@ class ActivityStack extends WindowContainer<Task> implements BoundsAnimationTarg
}
}
- void addStartingWindowsForVisibleActivities(boolean taskSwitch) {
- for (int taskNdx = getChildCount() - 1; taskNdx >= 0; --taskNdx) {
- getChildAt(taskNdx).addStartingWindowsForVisibleActivities(taskSwitch);
- }
- }
-
/**
* @return true if the top visible activity wants to occlude the Keyguard, false otherwise
*/
@@ -2127,18 +2100,6 @@ class ActivityStack extends WindowContainer<Task> implements BoundsAnimationTarg
mHandler.sendEmptyMessageDelayed(TRANSLUCENT_TIMEOUT_MSG, TRANSLUCENT_CONVERSION_TIMEOUT);
}
- void clearOtherAppTimeTrackers(AppTimeTracker except) {
- for (int taskNdx = getChildCount() - 1; taskNdx >= 0; --taskNdx) {
- final Task task = getChildAt(taskNdx);
- for (int activityNdx = task.getChildCount() - 1; activityNdx >= 0; --activityNdx) {
- final ActivityRecord r = task.getChildAt(activityNdx);
- if ( r.appTimeTracker != except) {
- r.appTimeTracker = null;
- }
- }
- }
- }
-
/**
* Called as activities below the top translucent activity are redrawn. When the last one is
* redrawn notify the top activity by calling
@@ -2186,50 +2147,8 @@ class ActivityStack extends WindowContainer<Task> implements BoundsAnimationTarg
*/
boolean checkBehindFullscreenActivity(ActivityRecord toCheck,
Consumer<ActivityRecord> handleBehindFullscreenActivity) {
- boolean aboveTop = true;
- boolean behindFullscreenActivity = false;
-
- if (!shouldBeVisible(null)) {
- // The stack is not visible, so no activity in it should be displaying a starting
- // window. Mark all activities below top and behind fullscreen.
- aboveTop = false;
- behindFullscreenActivity = true;
- }
-
- final boolean handlingOccluded = toCheck == null && handleBehindFullscreenActivity != null;
- if (!handlingOccluded && behindFullscreenActivity) {
- return true;
- }
-
- final ActivityRecord topActivity = topRunningActivityLocked();
- for (int taskNdx = getChildCount() - 1; taskNdx >= 0; --taskNdx) {
- final Task task = getChildAt(taskNdx);
- for (int activityNdx = task.getChildCount() - 1; activityNdx >= 0; --activityNdx) {
- final ActivityRecord r = task.getChildAt(activityNdx);
- if (aboveTop) {
- if (r == topActivity) {
- if (r == toCheck) {
- // It is the top activity in a visible stack.
- return false;
- }
- aboveTop = false;
- }
- behindFullscreenActivity |= r.occludesParent();
- continue;
- }
-
- if (handlingOccluded) {
- handleBehindFullscreenActivity.accept(r);
- } else if (r == toCheck) {
- return behindFullscreenActivity;
- } else if (behindFullscreenActivity) {
- // It is occluded before {@param toCheck} is found.
- return true;
- }
- behindFullscreenActivity |= r.occludesParent();
- }
- }
- return behindFullscreenActivity;
+ return mCheckBehindFullscreenActivityHelper.process(
+ toCheck, handleBehindFullscreenActivity);
}
/**
@@ -2787,7 +2706,7 @@ class ActivityStack extends WindowContainer<Task> implements BoundsAnimationTarg
}
break;
} else if (!isOccluded) {
- isOccluded = task.forAllActivities(ActivityRecord::occludesParent);
+ isOccluded = task.getActivity(ActivityRecord::occludesParent) != null;
}
}
}
@@ -2812,7 +2731,7 @@ class ActivityStack extends WindowContainer<Task> implements BoundsAnimationTarg
// The transition animation and starting window are not needed if {@code allowMoveToFront}
// is false, because the activity won't be visible.
- if ((!isHomeOrRecentsStack() || numActivities() > 0) && allowMoveToFront) {
+ if ((!isHomeOrRecentsStack() || hasActivity()) && allowMoveToFront) {
final DisplayContent dc = getDisplay().mDisplayContent;
if (DEBUG_TRANSITION) Slog.v(TAG_TRANSITION,
"Prepare open transition: starting " + r);
@@ -2915,8 +2834,7 @@ class ActivityStack extends WindowContainer<Task> implements BoundsAnimationTarg
return true;
}
- private boolean isTaskSwitch(ActivityRecord r,
- ActivityRecord topFocusedActivity) {
+ private boolean isTaskSwitch(ActivityRecord r, ActivityRecord topFocusedActivity) {
return topFocusedActivity != null && r.getTask() != topFocusedActivity.getTask();
}
@@ -2996,23 +2914,6 @@ class ActivityStack extends WindowContainer<Task> implements BoundsAnimationTarg
return stack;
}
- /** Finish all activities that were started for result from the specified activity. */
- final void finishSubActivityLocked(ActivityRecord self, String resultWho, int requestCode) {
- for (int taskNdx = getChildCount() - 1; taskNdx >= 0; --taskNdx) {
- final Task task = getChildAt(taskNdx);
- for (int activityNdx = task.getChildCount() - 1; activityNdx >= 0; --activityNdx) {
- final ActivityRecord r = task.getChildAt(activityNdx);
- if (r.resultTo == self && r.requestCode == requestCode) {
- if ((r.resultWho == null && resultWho == null) ||
- (r.resultWho != null && r.resultWho.equals(resultWho))) {
- r.finishIfPossible("request-sub", false /* oomAdj */);
- }
- }
- }
- }
- mService.updateOomAdj();
- }
-
/**
* Finish the topmost activity that belongs to the crashed app. We may also finish the activity
* that requested launch of the crashed one to prevent launch-crash loop.
@@ -3023,103 +2924,84 @@ class ActivityStack extends WindowContainer<Task> implements BoundsAnimationTarg
*/
final Task finishTopCrashedActivityLocked(WindowProcessController app, String reason) {
ActivityRecord r = topRunningActivityLocked();
- Task finishedTask = null;
if (r == null || r.app != app) {
return null;
}
Slog.w(TAG, " Force finishing activity "
+ r.intent.getComponent().flattenToShortString());
- finishedTask = r.getTask();
- int taskNdx = mChildren.indexOf(finishedTask);
- final Task task = finishedTask;
- int activityNdx = task.mChildren.indexOf(r);
+ Task finishedTask = r.getTask();
getDisplay().mDisplayContent.prepareAppTransition(
TRANSIT_CRASHING_ACTIVITY_CLOSE, false /* alwaysKeepCurrent */);
r.finishIfPossible(reason, false /* oomAdj */);
- finishedTask = task;
- // Also terminate any activities below it that aren't yet
- // stopped, to avoid a situation where one will get
- // re-start our crashing activity once it gets resumed again.
- --activityNdx;
- if (activityNdx < 0) {
- do {
- --taskNdx;
- if (taskNdx < 0) {
- break;
- }
- activityNdx = getChildAt(taskNdx).getChildCount() - 1;
- } while (activityNdx < 0);
- }
- if (activityNdx >= 0) {
- r = getChildAt(taskNdx).getChildAt(activityNdx);
- if (r.isState(STARTED, RESUMED, PAUSING, PAUSED)) {
- if (!r.isActivityTypeHome() || mService.mHomeProcess != r.app) {
+
+ // Also terminate any activities below it that aren't yet stopped, to avoid a situation
+ // where one will get re-start our crashing activity once it gets resumed again.
+ final ActivityRecord activityBelow = getActivityBelow(r);
+ if (activityBelow != null) {
+ if (activityBelow.isState(STARTED, RESUMED, PAUSING, PAUSED)) {
+ if (!activityBelow.isActivityTypeHome()
+ || mService.mHomeProcess != activityBelow.app) {
Slog.w(TAG, " Force finishing activity "
- + r.intent.getComponent().flattenToShortString());
- r.finishIfPossible(reason, false /* oomAdj */);
+ + activityBelow.intent.getComponent().flattenToShortString());
+ activityBelow.finishIfPossible(reason, false /* oomAdj */);
}
}
}
+
return finishedTask;
}
- final void finishVoiceTask(IVoiceInteractionSession session) {
- IBinder sessionBinder = session.asBinder();
- boolean didOne = false;
- for (int taskNdx = getChildCount() - 1; taskNdx >= 0; --taskNdx) {
- Task tr = getChildAt(taskNdx);
- if (tr.voiceSession != null && tr.voiceSession.asBinder() == sessionBinder) {
- for (int activityNdx = tr.getChildCount() - 1; activityNdx >= 0; --activityNdx) {
- ActivityRecord r = tr.getChildAt(activityNdx);
- if (!r.finishing) {
- r.finishIfPossible("finish-voice", false /* oomAdj */);
- didOne = true;
- }
- }
- } else {
- // Check if any of the activities are using voice
- for (int activityNdx = tr.getChildCount() - 1; activityNdx >= 0; --activityNdx) {
- ActivityRecord r = tr.getChildAt(activityNdx);
- if (r.voiceSession != null && r.voiceSession.asBinder() == sessionBinder) {
- // Inform of cancellation
- r.clearVoiceSessionLocked();
- try {
- r.app.getThread().scheduleLocalVoiceInteractionStarted(
- r.appToken, null);
- } catch (RemoteException re) {
- // Ok
- }
- mService.finishRunningVoiceLocked();
- break;
- }
- }
- }
+ void finishVoiceTask(IVoiceInteractionSession session) {
+ final PooledConsumer c = PooledLambda.obtainConsumer(ActivityStack::finishIfVoiceTask,
+ PooledLambda.__(Task.class), session.asBinder());
+ forAllTasks(c);
+ c.recycle();
+ }
+
+ private static void finishIfVoiceTask(Task tr, IBinder binder) {
+ if (tr.voiceSession != null && tr.voiceSession.asBinder() == binder) {
+ tr.forAllActivities((r) -> {
+ if (r.finishing) return;
+ r.finishIfPossible("finish-voice", false /* oomAdj */);
+ tr.mAtmService.updateOomAdj();
+ });
+ } else {
+ // Check if any of the activities are using voice
+ final PooledFunction f = PooledLambda.obtainFunction(
+ ActivityStack::finishIfVoiceActivity, PooledLambda.__(ActivityRecord.class),
+ binder);
+ tr.forAllActivities(f);
+ f.recycle();
}
+ }
- if (didOne) {
- mService.updateOomAdj();
+ private static boolean finishIfVoiceActivity(ActivityRecord r, IBinder binder) {
+ if (r.voiceSession == null || r.voiceSession.asBinder() != binder) return false;
+ // Inform of cancellation
+ r.clearVoiceSessionLocked();
+ try {
+ r.app.getThread().scheduleLocalVoiceInteractionStarted(r.appToken, null);
+ } catch (RemoteException re) {
+ // Ok Boomer...
}
+ r.mAtmService.finishRunningVoiceLocked();
+ return true;
}
/** Finish all activities in the stack without waiting. */
void finishAllActivitiesImmediately() {
- boolean noActivitiesInStack = true;
- for (int taskNdx = getChildCount() - 1; taskNdx >= 0; --taskNdx) {
- final Task task = getChildAt(taskNdx);
- for (int activityNdx = task.getChildCount() - 1; activityNdx >= 0; --activityNdx) {
- final ActivityRecord r = task.getChildAt(activityNdx);
- noActivitiesInStack = false;
- Slog.d(TAG, "finishAllActivitiesImmediatelyLocked: finishing " + r);
- r.destroyIfPossible("finishAllActivitiesImmediatelyLocked");
- }
- }
- if (noActivitiesInStack) {
+ if (!hasChild()) {
removeIfPossible();
+ return;
}
+ forAllActivities((r) -> {
+ Slog.d(TAG, "finishAllActivitiesImmediatelyLocked: finishing " + r);
+ r.destroyIfPossible("finishAllActivitiesImmediately");
+ });
}
/** @return true if the stack behind this one is a standard activity type. */
- boolean inFrontOfStandardStack() {
+ private boolean inFrontOfStandardStack() {
final ActivityDisplay display = getDisplay();
if (display == null) {
return false;
@@ -3166,28 +3048,25 @@ class ActivityStack extends WindowContainer<Task> implements BoundsAnimationTarg
return false;
}
- final boolean navigateUpToLocked(ActivityRecord srec, Intent destIntent, int resultCode,
+ boolean navigateUpTo(ActivityRecord srec, Intent destIntent, int resultCode,
Intent resultData) {
final Task task = srec.getTask();
- final ArrayList<ActivityRecord> activities = task.mChildren;
- final int start = activities.indexOf(srec);
- if (!mChildren.contains(task) || (start < 0)) {
+
+ if (!mChildren.contains(task) || !task.hasChild(srec)) {
return false;
}
- int finishTo = start - 1;
- ActivityRecord parent = finishTo < 0 ? null : task.getChildAt(finishTo);
+
+ ActivityRecord parent = task.getActivityBelow(srec);
boolean foundParentInTask = false;
final ComponentName dest = destIntent.getComponent();
- if (start > 0 && dest != null) {
- for (int i = finishTo; i >= 0; i--) {
- ActivityRecord r = task.getChildAt(i);
- if (r.info.packageName.equals(dest.getPackageName()) &&
- r.info.name.equals(dest.getClassName())) {
- finishTo = i;
- parent = r;
- foundParentInTask = true;
- break;
- }
+ if (task.getBottomMostActivity() != srec && dest != null) {
+ final ActivityRecord candidate = task.getActivity((ar) ->
+ ar.info.packageName.equals(dest.getPackageName()) &&
+ ar.info.name.equals(dest.getClassName()), srec, false /*includeBoundary*/,
+ true /*traverseTopToBottom*/);
+ if (candidate != null) {
+ parent = candidate;
+ foundParentInTask = true;
}
}
@@ -3212,13 +3091,24 @@ class ActivityStack extends WindowContainer<Task> implements BoundsAnimationTarg
}
}
final long origId = Binder.clearCallingIdentity();
- for (int i = start; i > finishTo; i--) {
- final ActivityRecord r = activities.get(i);
- r.finishIfPossible(resultCode, resultData, "navigate-up", true /* oomAdj */);
+
+ final int[] resultCodeHolder = new int[1];
+ resultCodeHolder[0] = resultCode;
+ final Intent[] resultDataHolder = new Intent[1];
+ resultDataHolder[0] = resultData;
+ final ActivityRecord finalParent = parent;
+ task.forAllActivities((ar) -> {
+ if (ar == finalParent) return true;
+
+ ar.finishIfPossible(
+ resultCodeHolder[0], resultDataHolder[0], "navigate-up", true /* oomAdj */);
// Only return the supplied result for the first activity finished
- resultCode = Activity.RESULT_CANCELED;
- resultData = null;
- }
+ resultCodeHolder[0] = Activity.RESULT_CANCELED;
+ resultDataHolder[0] = null;
+ return false;
+ }, srec, true, true);
+ resultCode = resultCodeHolder[0];
+ resultData = resultDataHolder[0];
if (parent != null && foundParentInTask) {
final int parentLaunchMode = parent.info.launchMode;
@@ -3285,7 +3175,6 @@ class ActivityStack extends WindowContainer<Task> implements BoundsAnimationTarg
}
}
- /// HANDLER INTERFACE BEGIN
void removeTimeoutsForActivity(ActivityRecord r) {
mStackSupervisor.removeTimeoutsForActivityLocked(r);
removePauseTimeoutForActivity(r);
@@ -3343,86 +3232,33 @@ class ActivityStack extends WindowContainer<Task> implements BoundsAnimationTarg
}
/// HANDLER INTERFACE END
- private void destroyActivitiesLocked(WindowProcessController owner, String reason) {
- boolean lastIsOpaque = false;
- boolean activityRemoved = false;
- for (int taskNdx = getChildCount() - 1; taskNdx >= 0; --taskNdx) {
- final Task task = getChildAt(taskNdx);
- for (int activityNdx = task.getChildCount() - 1; activityNdx >= 0; --activityNdx) {
- final ActivityRecord r = task.getChildAt(activityNdx);
- if (r.finishing) {
- continue;
- }
- if (r.occludesParent()) {
- lastIsOpaque = true;
- }
- if (owner != null && r.app != owner) {
- continue;
- }
- if (!lastIsOpaque) {
- continue;
- }
- if (r.isDestroyable()) {
- if (DEBUG_SWITCH) Slog.v(TAG_SWITCH, "Destroying " + r
- + " in state " + r.getState()
- + " resumed=" + mResumedActivity
- + " pausing=" + mPausingActivity + " for reason " + reason);
- if (r.destroyImmediately(true /* removeFromTask */, reason)) {
- activityRemoved = true;
- }
- }
- }
- }
- if (activityRemoved) {
+ private void destroyActivities(WindowProcessController owner, String reason) {
+ try {
+ mStackSupervisor.beginDeferResume();
+
+ final PooledConsumer c = PooledLambda.obtainConsumer(ActivityStack::destroyActivity,
+ PooledLambda.__(ActivityRecord.class), owner, reason);
+ forAllActivities(c);
+ c.recycle();
+ } finally {
+ mStackSupervisor.endDeferResume();
mRootActivityContainer.resumeFocusedStacksTopActivities();
}
}
- final int releaseSomeActivitiesLocked(WindowProcessController app, ArraySet<Task> tasks,
- String reason) {
- // Iterate over tasks starting at the back (oldest) first.
- if (DEBUG_RELEASE) Slog.d(TAG_RELEASE, "Trying to release some activities in " + app);
- int maxTasks = tasks.size() / 4;
- if (maxTasks < 1) {
- maxTasks = 1;
- }
- int numReleased = 0;
- for (int taskNdx = 0; taskNdx < getChildCount() && maxTasks > 0; taskNdx++) {
- final Task task = getChildAt(taskNdx);
- if (!tasks.contains(task)) {
- continue;
- }
- if (DEBUG_RELEASE) Slog.d(TAG_RELEASE, "Looking for activities to release in " + task);
- int curNum = 0;
- for (int actNdx = 0; actNdx < task.getChildCount(); actNdx++) {
- final ActivityRecord activity = task.getChildAt(actNdx);
- if (activity.app == app && activity.isDestroyable()) {
- if (DEBUG_RELEASE) Slog.v(TAG_RELEASE, "Destroying " + activity
- + " in state " + activity.getState() + " resumed=" + mResumedActivity
- + " pausing=" + mPausingActivity + " for reason " + reason);
- activity.destroyImmediately(true /* removeFromApp */, reason);
- if (task.getChildAt(actNdx) != activity) {
- // Was removed from list, back up so we don't miss the next one.
- actNdx--;
- }
- curNum++;
- }
- }
- if (curNum > 0) {
- numReleased += curNum;
- maxTasks--;
- if (getChildAt(taskNdx) != task) {
- // The entire task got removed, back up so we don't miss the next one.
- taskNdx--;
- }
- }
- }
- if (DEBUG_RELEASE) Slog.d(TAG_RELEASE,
- "Done releasing: did " + numReleased + " activities");
- return numReleased;
+ private static void destroyActivity(
+ ActivityRecord r, WindowProcessController owner, String reason) {
+ if (r.finishing || (owner != null && r.app != owner) || !r.isDestroyable()) return;
+
+ if (DEBUG_SWITCH) Slog.v(TAG_SWITCH, "Destroying " + r
+ + " in state " + r.getState()
+ + " resumed=" + r.getStack().mResumedActivity
+ + " pausing=" + r.getStack().mPausingActivity + " for reason " + reason);
+
+ r.destroyImmediately(true /* removeFromTask */, reason);
}
- private void removeHistoryRecordsForAppLocked(ArrayList<ActivityRecord> list,
+ private void removeHistoryRecordsForApp(ArrayList<ActivityRecord> list,
WindowProcessController app, String listName) {
int i = list.size();
if (DEBUG_CLEANUP) Slog.v(TAG_CLEANUP,
@@ -3439,107 +3275,15 @@ class ActivityStack extends WindowContainer<Task> implements BoundsAnimationTarg
}
}
- private boolean removeHistoryRecordsForAppLocked(WindowProcessController app) {
- removeHistoryRecordsForAppLocked(mLruActivities, app, "mLruActivities");
- removeHistoryRecordsForAppLocked(mStackSupervisor.mStoppingActivities, app,
+ private boolean removeHistoryRecordsForApp(WindowProcessController app) {
+ removeHistoryRecordsForApp(mLruActivities, app, "mLruActivities");
+ removeHistoryRecordsForApp(mStackSupervisor.mStoppingActivities, app,
"mStoppingActivities");
- removeHistoryRecordsForAppLocked(mStackSupervisor.mGoingToSleepActivities, app,
+ removeHistoryRecordsForApp(mStackSupervisor.mGoingToSleepActivities, app,
"mGoingToSleepActivities");
- removeHistoryRecordsForAppLocked(mStackSupervisor.mFinishingActivities, app,
+ removeHistoryRecordsForApp(mStackSupervisor.mFinishingActivities, app,
"mFinishingActivities");
-
- final boolean isProcessRemoved = app.isRemoved();
- if (isProcessRemoved) {
- // The package of the died process should be force-stopped, so make its activities as
- // finishing to prevent the process from being started again if the next top (or being
- // visible) activity also resides in the same process.
- app.makeFinishingForProcessRemoved();
- }
-
- boolean hasVisibleActivities = false;
-
- // Clean out the history list.
- int i = numActivities();
- if (DEBUG_CLEANUP) Slog.v(TAG_CLEANUP,
- "Removing app " + app + " from history with " + i + " entries");
- for (int taskNdx = getChildCount() - 1; taskNdx >= 0; --taskNdx) {
- final ArrayList<ActivityRecord> activities = getChildAt(taskNdx).mChildren;
- mTmpActivities.clear();
- mTmpActivities.addAll(activities);
-
- while (!mTmpActivities.isEmpty()) {
- final int targetIndex = mTmpActivities.size() - 1;
- final ActivityRecord r = mTmpActivities.remove(targetIndex);
- if (DEBUG_CLEANUP) Slog.v(TAG_CLEANUP,
- "Record #" + targetIndex + " " + r + ": app=" + r.app);
-
- if (r.app == app) {
- if (r.isVisible() || r.mVisibleRequested) {
- // While an activity launches a new activity, it's possible that the old
- // activity is already requested to be hidden (mVisibleRequested=false), but
- // this visibility is not yet committed, so isVisible()=true.
- hasVisibleActivities = true;
- }
- final boolean remove;
- if ((r.mRelaunchReason == RELAUNCH_REASON_WINDOWING_MODE_RESIZE
- || r.mRelaunchReason == RELAUNCH_REASON_FREE_RESIZE)
- && r.launchCount < 3 && !r.finishing) {
- // If the process crashed during a resize, always try to relaunch it, unless
- // it has failed more than twice. Skip activities that's already finishing
- // cleanly by itself.
- remove = false;
- } else if ((!r.hasSavedState() && !r.stateNotNeeded
- && !r.isState(ActivityState.RESTARTING_PROCESS)) || r.finishing) {
- // Don't currently have state for the activity, or
- // it is finishing -- always remove it.
- remove = true;
- } else if (!r.mVisibleRequested && r.launchCount > 2
- && r.lastLaunchTime > (SystemClock.uptimeMillis() - 60000)) {
- // We have launched this activity too many times since it was
- // able to run, so give up and remove it.
- // (Note if the activity is visible, we don't remove the record.
- // We leave the dead window on the screen but the process will
- // not be restarted unless user explicitly tap on it.)
- remove = true;
- } else {
- // The process may be gone, but the activity lives on!
- remove = false;
- }
- if (remove) {
- if (DEBUG_ADD_REMOVE || DEBUG_CLEANUP) Slog.i(TAG_ADD_REMOVE,
- "Removing activity " + r + " from stack at " + i
- + ": hasSavedState=" + r.hasSavedState()
- + " stateNotNeeded=" + r.stateNotNeeded
- + " finishing=" + r.finishing
- + " state=" + r.getState() + " callers=" + Debug.getCallers(5));
- if (!r.finishing || isProcessRemoved) {
- Slog.w(TAG, "Force removing " + r + ": app died, no saved state");
- EventLogTags.writeWmFinishActivity(r.mUserId,
- System.identityHashCode(r), r.getTask().mTaskId,
- r.shortComponentName, "proc died without state saved");
- }
- } else {
- // We have the current state for this activity, so
- // it can be restarted later when needed.
- if (DEBUG_ALL) Slog.v(TAG, "Keeping entry, setting app to null");
- if (DEBUG_APP) Slog.v(TAG_APP,
- "Clearing app during removeHistory for activity " + r);
- r.app = null;
- // Set nowVisible to previous visible state. If the app was visible while
- // it died, we leave the dead window on screen so it's basically visible.
- // This is needed when user later tap on the dead window, we need to stop
- // other apps when user transfers focus to the restarted activity.
- r.nowVisible = r.mVisibleRequested;
- }
- r.cleanUp(true /* cleanServices */, true /* setState */);
- if (remove) {
- r.removeFromHistory("appDied");
- }
- }
- }
- }
-
- return hasVisibleActivities;
+ return mRemoveHistoryRecordsForApp.process(app);
}
private void updateTransitLocked(int transit, ActivityOptions options) {
@@ -3559,8 +3303,7 @@ class ActivityStack extends WindowContainer<Task> implements BoundsAnimationTarg
if (DEBUG_SWITCH) Slog.v(TAG_SWITCH, "moveTaskToFront: " + tr);
final ActivityStack topStack = getDisplay().getTopStack();
- final ActivityRecord topActivity = topStack != null
- ? topStack.getTopNonFinishingActivity() : null;
+ final ActivityRecord topActivity = topStack != null ? topStack.getTopNonFinishingActivity() : null;
final int numTasks = getChildCount();
final int index = mChildren.indexOf(tr);
if (numTasks == 0 || index < 0) {
@@ -3575,9 +3318,10 @@ class ActivityStack extends WindowContainer<Task> implements BoundsAnimationTarg
if (timeTracker != null) {
// The caller wants a time tracker associated with this task.
- for (int i = tr.getChildCount() - 1; i >= 0; i--) {
- tr.getChildAt(i).appTimeTracker = timeTracker;
- }
+ final PooledConsumer c = PooledLambda.obtainConsumer(ActivityRecord::setAppTimeTracker,
+ PooledLambda.__(ActivityRecord.class), timeTracker);
+ tr.forAllActivities(c);
+ c.recycle();
}
try {
@@ -3711,38 +3455,8 @@ class ActivityStack extends WindowContainer<Task> implements BoundsAnimationTarg
/**
* Ensures all visible activities at or below the input activity have the right configuration.
*/
- void ensureVisibleActivitiesConfigurationLocked(ActivityRecord start, boolean preserveWindow) {
- if (start == null || !start.mVisibleRequested) {
- return;
- }
-
- final Task startTask = start.getTask();
- boolean behindFullscreen = false;
- boolean updatedConfig = false;
-
- for (int taskIndex = mChildren.indexOf(startTask); taskIndex >= 0; --taskIndex) {
- final Task task = getChildAt(taskIndex);
- final ArrayList<ActivityRecord> activities = task.mChildren;
- int activityIndex = (start.getTask() == task)
- ? activities.indexOf(start) : activities.size() - 1;
- for (; activityIndex >= 0; --activityIndex) {
- final ActivityRecord r = activities.get(activityIndex);
- updatedConfig |= r.ensureActivityConfiguration(0 /* globalChanges */,
- preserveWindow);
- if (r.occludesParent()) {
- behindFullscreen = true;
- break;
- }
- }
- if (behindFullscreen) {
- break;
- }
- }
- if (updatedConfig) {
- // Ensure the resumed state of the focus activity if we updated the configuration of
- // any activity.
- mRootActivityContainer.resumeFocusedStacksTopActivities();
- }
+ void ensureVisibleActivitiesConfiguration(ActivityRecord start, boolean preserveWindow) {
+ mEnsureVisibleActivitiesConfigHelper.process(start, preserveWindow);
}
// TODO: Can only be called from special methods in ActivityStackSupervisor.
@@ -3774,7 +3488,7 @@ class ActivityStack extends WindowContainer<Task> implements BoundsAnimationTarg
setBounds(bounds);
if (!deferResume) {
- ensureVisibleActivitiesConfigurationLocked(
+ ensureVisibleActivitiesConfiguration(
topRunningActivityLocked(), preserveWindows);
}
} finally {
@@ -3818,83 +3532,21 @@ class ActivityStack extends WindowContainer<Task> implements BoundsAnimationTarg
}
}
- boolean willActivityBeVisibleLocked(IBinder token) {
- for (int taskNdx = getChildCount() - 1; taskNdx >= 0; --taskNdx) {
- final Task task = getChildAt(taskNdx);
- for (int activityNdx = task.getChildCount() - 1; activityNdx >= 0; --activityNdx) {
- final ActivityRecord r = task.getChildAt(activityNdx);
- if (r.appToken == token) {
- return true;
- }
- if (r.occludesParent() && !r.finishing) {
- return false;
- }
- }
- }
+ boolean willActivityBeVisible(IBinder token) {
final ActivityRecord r = ActivityRecord.forTokenLocked(token);
if (r == null) {
return false;
}
- if (r.finishing) Slog.e(TAG, "willActivityBeVisibleLocked: Returning false,"
- + " would have returned true for r=" + r);
- return !r.finishing;
- }
- void closeSystemDialogsLocked() {
- for (int taskNdx = getChildCount() - 1; taskNdx >= 0; --taskNdx) {
- final Task task = getChildAt(taskNdx);
- for (int activityNdx = task.getChildCount() - 1; activityNdx >= 0; --activityNdx) {
- final ActivityRecord r = task.getChildAt(activityNdx);
- if ((r.info.flags&ActivityInfo.FLAG_FINISH_ON_CLOSE_SYSTEM_DIALOGS) != 0) {
- r.finishIfPossible("close-sys", true /* oomAdj */);
- }
- }
- }
- }
+ // See if there is an occluding activity on-top of this one.
+ final ActivityRecord occludingActivity = getActivity((ar) ->
+ ar.occludesParent() && !ar.finishing,
+ r, false /*includeBoundary*/, true /*traverseTopToBottom*/);
+ if (occludingActivity != null) return false;
- boolean finishDisabledPackageActivitiesLocked(String packageName, Set<String> filterByClasses,
- boolean doit, boolean evenPersistent, int userId) {
- boolean didSomething = false;
- Task lastTask = null;
- ComponentName homeActivity = null;
- for (int taskNdx = getChildCount() - 1; taskNdx >= 0; --taskNdx) {
- final ArrayList<ActivityRecord> activities = getChildAt(taskNdx).mChildren;
- mTmpActivities.clear();
- mTmpActivities.addAll(activities);
-
- while (!mTmpActivities.isEmpty()) {
- ActivityRecord r = mTmpActivities.remove(0);
- final boolean sameComponent =
- (r.packageName.equals(packageName) && (filterByClasses == null
- || filterByClasses.contains(r.mActivityComponent.getClassName())))
- || (packageName == null && r.mUserId == userId);
- if ((userId == UserHandle.USER_ALL || r.mUserId == userId)
- && (sameComponent || r.getTask() == lastTask)
- && (r.app == null || evenPersistent || !r.app.isPersistent())) {
- if (!doit) {
- if (r.finishing) {
- // If this activity is just finishing, then it is not
- // interesting as far as something to stop.
- continue;
- }
- return true;
- }
- if (r.isActivityTypeHome()) {
- if (homeActivity != null && homeActivity.equals(r.mActivityComponent)) {
- Slog.i(TAG, "Skip force-stop again " + r);
- continue;
- } else {
- homeActivity = r.mActivityComponent;
- }
- }
- didSomething = true;
- Slog.i(TAG, " Force finishing activity " + r);
- lastTask = r.getTask();
- r.finishIfPossible("force-stop", true);
- }
- }
- }
- return didSomething;
+ if (r.finishing) Slog.e(TAG, "willActivityBeVisible: Returning false,"
+ + " would have returned true for r=" + r);
+ return !r.finishing;
}
/**
@@ -3948,14 +3600,11 @@ class ActivityStack extends WindowContainer<Task> implements BoundsAnimationTarg
}
void unhandledBackLocked() {
- final int top = getChildCount() - 1;
- if (DEBUG_SWITCH) Slog.d(TAG_SWITCH, "Performing unhandledBack(): top activity at " + top);
- if (top >= 0) {
- final Task task = getChildAt(top);
- int activityTop = task.getChildCount() - 1;
- if (activityTop >= 0) {
- task.getChildAt(activityTop).finishIfPossible("unhandled-back", true /* oomAdj */);
- }
+ final ActivityRecord topActivity = getTopMostActivity();
+ if (DEBUG_SWITCH) Slog.d(TAG_SWITCH,
+ "Performing unhandledBack(): top activity: " + topActivity);
+ if (topActivity != null) {
+ topActivity.finishIfPossible("unhandled-back", true /* oomAdj */);
}
}
@@ -3975,25 +3624,7 @@ class ActivityStack extends WindowContainer<Task> implements BoundsAnimationTarg
mLastNoHistoryActivity = null;
}
- return removeHistoryRecordsForAppLocked(app);
- }
-
- void handleAppCrash(WindowProcessController app) {
- for (int taskNdx = getChildCount() - 1; taskNdx >= 0; --taskNdx) {
- final Task task = getChildAt(taskNdx);
- for (int activityNdx = task.getChildCount() - 1; activityNdx >= 0; --activityNdx) {
- final ActivityRecord r = task.getChildAt(activityNdx);
- if (r.app == app) {
- Slog.w(TAG, " Force finishing activity "
- + r.intent.getComponent().flattenToShortString());
- // Force the destroy to skip right to removal.
- r.app = null;
- getDisplay().mDisplayContent.prepareAppTransition(
- TRANSIT_CRASHING_ACTIVITY_CLOSE, false /* alwaysKeepCurrent */);
- r.destroyIfPossible("handleAppCrashedLocked");
- }
- }
- }
+ return removeHistoryRecordsForApp(app);
}
boolean dump(FileDescriptor fd, PrintWriter pw, boolean dumpAll, boolean dumpClient,
@@ -4004,8 +3635,7 @@ class ActivityStack extends WindowContainer<Task> implements BoundsAnimationTarg
pw.println(" isSleeping=" + shouldSleepActivities());
pw.println(" mBounds=" + getRequestedOverrideBounds());
- boolean printed = dumpActivitiesLocked(fd, pw, dumpAll, dumpClient, dumpPackage,
- needSep);
+ boolean printed = dumpActivities(fd, pw, dumpAll, dumpClient, dumpPackage, needSep);
printed |= dumpHistoryList(fd, pw, mLruActivities, " ", "Run", false,
!dumpAll, false, dumpPackage, true,
@@ -4037,15 +3667,14 @@ class ActivityStack extends WindowContainer<Task> implements BoundsAnimationTarg
return printed;
}
- boolean dumpActivitiesLocked(FileDescriptor fd, PrintWriter pw, boolean dumpAll,
+ private boolean dumpActivities(FileDescriptor fd, PrintWriter pw, boolean dumpAll,
boolean dumpClient, String dumpPackage, boolean needSep) {
if (!hasChild()) {
return false;
}
final String prefix = " ";
- for (int taskNdx = getChildCount() - 1; taskNdx >= 0; --taskNdx) {
- final Task task = getChildAt(taskNdx);
+ forAllTasks((task) -> {
if (needSep) {
pw.println("");
}
@@ -4056,9 +3685,11 @@ class ActivityStack extends WindowContainer<Task> implements BoundsAnimationTarg
pw.println(prefix + "mLastNonFullscreenBounds=" + task.mLastNonFullscreenBounds);
pw.println(prefix + "* " + task);
task.dump(pw, prefix + " ");
- dumpHistoryList(fd, pw, getChildAt(taskNdx).mChildren,
- prefix, "Hist", true, !dumpAll, dumpClient, dumpPackage, false, null, task);
- }
+ final ArrayList<ActivityRecord> activities = new ArrayList<>();
+ forAllActivities((Consumer<ActivityRecord>) activities::add);
+ dumpHistoryList(fd, pw, activities, prefix, "Hist", true, !dumpAll, dumpClient,
+ dumpPackage, false, null, task);
+ });
return true;
}
@@ -4066,31 +3697,21 @@ class ActivityStack extends WindowContainer<Task> implements BoundsAnimationTarg
ArrayList<ActivityRecord> activities = new ArrayList<>();
if ("all".equals(name)) {
- for (int taskNdx = getChildCount() - 1; taskNdx >= 0; --taskNdx) {
- activities.addAll(getChildAt(taskNdx).mChildren);
- }
+ forAllActivities((Consumer<ActivityRecord>) activities::add);
} else if ("top".equals(name)) {
- final int top = getChildCount() - 1;
- if (top >= 0) {
- final Task task = getChildAt(top);
- int listTop = task.getChildCount() - 1;
- if (listTop >= 0) {
- activities.add(task.getChildAt(listTop));
- }
+ final ActivityRecord topActivity = getTopMostActivity();
+ if (topActivity != null) {
+ activities.add(topActivity);
}
} else {
ItemMatcher matcher = new ItemMatcher();
matcher.build(name);
- for (int taskNdx = getChildCount() - 1; taskNdx >= 0; --taskNdx) {
- final Task task = getChildAt(taskNdx);
- for (int activityNdx = task.getChildCount() - 1; activityNdx >= 0; --activityNdx) {
- final ActivityRecord r1 = task.getChildAt(activityNdx);
- if (matcher.match(r1, r1.intent.getComponent())) {
- activities.add(r1);
- }
+ forAllActivities((r) -> {
+ if (matcher.match(r, r.intent.getComponent())) {
+ activities.add(r);
}
- }
+ });
}
return activities;
@@ -4101,22 +3722,24 @@ class ActivityStack extends WindowContainer<Task> implements BoundsAnimationTarg
// All activities that came from the package must be
// restarted as if there was a config change.
- for (int taskNdx = getChildCount() - 1; taskNdx >= 0; --taskNdx) {
- final Task task = getChildAt(taskNdx);
- for (int activityNdx = task.getChildCount() - 1; activityNdx >= 0; --activityNdx) {
- final ActivityRecord a = task.getChildAt(activityNdx);
- if (a.info.packageName.equals(packageName)) {
- a.forceNewConfig = true;
- if (starting != null && a == starting && a.mVisibleRequested) {
- a.startFreezingScreenLocked(CONFIG_SCREEN_LAYOUT);
- }
- }
- }
- }
+ PooledConsumer c = PooledLambda.obtainConsumer(ActivityStack::restartPackage,
+ PooledLambda.__(ActivityRecord.class), starting, packageName);
+ forAllActivities(c);
+ c.recycle();
return starting;
}
+ private static void restartPackage(
+ ActivityRecord r, ActivityRecord starting, String packageName) {
+ if (r.info.packageName.equals(packageName)) {
+ r.forceNewConfig = true;
+ if (starting != null && r == starting && r.mVisibleRequested) {
+ r.startFreezingScreenLocked(CONFIG_SCREEN_LAYOUT);
+ }
+ }
+ }
+
/**
* Removes the input task from this stack.
*
diff --git a/services/core/java/com/android/server/wm/ActivityStackSupervisor.java b/services/core/java/com/android/server/wm/ActivityStackSupervisor.java
index d088a5e286c1..0376d2cf9c82 100644
--- a/services/core/java/com/android/server/wm/ActivityStackSupervisor.java
+++ b/services/core/java/com/android/server/wm/ActivityStackSupervisor.java
@@ -138,6 +138,7 @@ import com.android.internal.content.ReferrerIntent;
import com.android.internal.os.TransferPipe;
import com.android.internal.os.logging.MetricsLoggerWrapper;
import com.android.internal.util.ArrayUtils;
+import com.android.internal.util.function.pooled.PooledConsumer;
import com.android.internal.util.function.pooled.PooledLambda;
import com.android.server.am.ActivityManagerService;
import com.android.server.am.UserState;
@@ -825,7 +826,7 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks {
task.mTaskId, r.shortComponentName);
if (r.isActivityTypeHome()) {
// Home process is the root process of the task.
- updateHomeProcess(task.getChildAt(0).app);
+ updateHomeProcess(task.getBottomMostActivity().app);
}
mService.getPackageManagerInternalLocked().notifyPackageUse(
r.intent.getComponent().getPackageName(), NOTIFY_PACKAGE_USE_ACTIVITY);
@@ -1688,7 +1689,7 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks {
}
}
if (!deferResume) {
- stack.ensureVisibleActivitiesConfigurationLocked(r, preserveWindows);
+ stack.ensureVisibleActivitiesConfiguration(r, preserveWindows);
}
} finally {
mAllowDockedStackResize = true;
@@ -2485,18 +2486,23 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks {
return;
}
- for (int i = task.getChildCount() - 1; i >= 0; i--) {
- final ActivityRecord r = task.getChildAt(i);
- if (r.attachedToProcess()) {
- mMultiWindowModeChangedActivities.add(r);
- }
- }
+ final PooledConsumer c = PooledLambda.obtainConsumer(
+ ActivityStackSupervisor::addToMultiWindowModeChangedList, this,
+ PooledLambda.__(ActivityRecord.class));
+ task.forAllActivities(c);
+ c.recycle();
if (!mHandler.hasMessages(REPORT_MULTI_WINDOW_MODE_CHANGED_MSG)) {
mHandler.sendEmptyMessage(REPORT_MULTI_WINDOW_MODE_CHANGED_MSG);
}
}
+ private void addToMultiWindowModeChangedList(ActivityRecord r) {
+ if (r.attachedToProcess()) {
+ mMultiWindowModeChangedActivities.add(r);
+ }
+ }
+
void scheduleUpdatePictureInPictureModeIfNeeded(Task task, ActivityStack prevStack) {
final ActivityStack stack = task.getStack();
if (prevStack == null || prevStack == stack
@@ -2507,17 +2513,13 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks {
scheduleUpdatePictureInPictureModeIfNeeded(task, stack.getRequestedOverrideBounds());
}
- void scheduleUpdatePictureInPictureModeIfNeeded(Task task, Rect targetStackBounds) {
- for (int i = task.getChildCount() - 1; i >= 0; i--) {
- final ActivityRecord r = task.getChildAt(i);
- if (r.attachedToProcess()) {
- mPipModeChangedActivities.add(r);
- // If we are scheduling pip change, then remove this activity from multi-window
- // change list as the processing of pip change will make sure multi-window changed
- // message is processed in the right order relative to pip changed.
- mMultiWindowModeChangedActivities.remove(r);
- }
- }
+ private void scheduleUpdatePictureInPictureModeIfNeeded(Task task, Rect targetStackBounds) {
+ final PooledConsumer c = PooledLambda.obtainConsumer(
+ ActivityStackSupervisor::addToPipModeChangedList, this,
+ PooledLambda.__(ActivityRecord.class));
+ task.forAllActivities(c);
+ c.recycle();
+
mPipModeChangedTargetStackBounds = targetStackBounds;
if (!mHandler.hasMessages(REPORT_PIP_MODE_CHANGED_MSG)) {
@@ -2525,14 +2527,23 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks {
}
}
+ private void addToPipModeChangedList(ActivityRecord r) {
+ if (!r.attachedToProcess()) return;
+
+ mPipModeChangedActivities.add(r);
+ // If we are scheduling pip change, then remove this activity from multi-window
+ // change list as the processing of pip change will make sure multi-window changed
+ // message is processed in the right order relative to pip changed.
+ mMultiWindowModeChangedActivities.remove(r);
+ }
+
void updatePictureInPictureMode(Task task, Rect targetStackBounds, boolean forceUpdate) {
mHandler.removeMessages(REPORT_PIP_MODE_CHANGED_MSG);
- for (int i = task.getChildCount() - 1; i >= 0; i--) {
- final ActivityRecord r = task.getChildAt(i);
- if (r.attachedToProcess()) {
- r.updatePictureInPictureMode(targetStackBounds, forceUpdate);
- }
- }
+ final PooledConsumer c = PooledLambda.obtainConsumer(
+ ActivityRecord::updatePictureInPictureMode,
+ PooledLambda.__(ActivityRecord.class), targetStackBounds, forceUpdate);
+ task.forAllActivities(c);
+ c.recycle();
}
void wakeUp(String reason) {
diff --git a/services/core/java/com/android/server/wm/ActivityStarter.java b/services/core/java/com/android/server/wm/ActivityStarter.java
index 7960842daf50..a496396fd637 100644
--- a/services/core/java/com/android/server/wm/ActivityStarter.java
+++ b/services/core/java/com/android/server/wm/ActivityStarter.java
@@ -1446,7 +1446,7 @@ class ActivityStarter {
// Stack should also be detached from display and be removed if it's empty.
if (startedActivityStack != null && startedActivityStack.isAttached()
- && startedActivityStack.numActivities() == 0
+ && !startedActivityStack.hasActivity()
&& !startedActivityStack.isActivityTypeHome()) {
startedActivityStack.removeIfPossible();
startedActivityStack = null;
@@ -1640,7 +1640,7 @@ class ActivityStarter {
return START_CANCELED;
}
- if (mRestrictedBgActivity && (newTask || !targetTask.containsAppUid(mCallingUid))
+ if (mRestrictedBgActivity && (newTask || !targetTask.isUidPresent(mCallingUid))
&& handleBackgroundActivityAbort(mStartActivity)) {
Slog.e(TAG, "Abort background activity starts from " + mCallingUid);
return START_ABORTED;
@@ -1880,8 +1880,8 @@ class ActivityStarter {
// In this case, we are launching an activity in our own task that may
// already be running somewhere in the history, and we want to shuffle it to
// the front of the stack if so.
- final ActivityRecord act = targetTask.findActivityInHistoryLocked(
- mStartActivity);
+ final ActivityRecord act =
+ targetTask.findActivityInHistory(mStartActivity.mActivityComponent);
if (act != null) {
final Task task = act.getTask();
task.moveActivityToFrontLocked(act);
diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
index bcd5d369ee0c..df0394041251 100644
--- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
+++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
@@ -247,6 +247,8 @@ import com.android.internal.policy.KeyguardDismissCallback;
import com.android.internal.util.ArrayUtils;
import com.android.internal.util.FastPrintWriter;
import com.android.internal.util.Preconditions;
+import com.android.internal.util.function.pooled.PooledConsumer;
+import com.android.internal.util.function.pooled.PooledFunction;
import com.android.internal.util.function.pooled.PooledLambda;
import com.android.server.AttributeCache;
import com.android.server.LocalServices;
@@ -695,6 +697,13 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
int caller() default NONE;
}
+ private final Runnable mUpdateOomAdjRunnable = new Runnable() {
+ @Override
+ public void run() {
+ mAmInternal.updateOomAdj();
+ }
+ };
+
@VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
public ActivityTaskManagerService(Context context) {
mContext = context;
@@ -1661,7 +1670,14 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
if (getLockTaskController().activityBlockedFromFinish(r)) {
return false;
}
- r.finishActivityAffinity();
+
+ final PooledFunction p = PooledLambda.obtainFunction(
+ ActivityRecord::finishIfSameAffinity, r,
+ PooledLambda.__(ActivityRecord.class));
+ r.getTask().forAllActivities(
+ p, r, true /*includeBoundary*/, true /*traverseTopToBottom*/);
+ p.recycle();
+
return true;
} finally {
Binder.restoreCallingIdentity(origId);
@@ -1994,10 +2010,8 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
if (r == null) {
return false;
}
- final Task task = r.getTask();
- int index = task.mChildren.lastIndexOf(r);
- if (index > 0) {
- ActivityRecord under = task.getChildAt(index - 1);
+ final ActivityRecord under = r.getTask().getActivityBelow(r);
+ if (under != null) {
under.returningOptions = safeOptions != null ? safeOptions.getOptions(r) : null;
}
return r.setOccludesParent(false);
@@ -2163,7 +2177,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
synchronized (mGlobalLock) {
final ActivityRecord r = ActivityRecord.forTokenLocked(token);
if (r != null) {
- return r.getActivityStack().navigateUpToLocked(
+ return r.getActivityStack().navigateUpTo(
r, destIntent, resultCode, resultData);
}
return false;
@@ -2548,11 +2562,22 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
public final void finishSubActivity(IBinder token, String resultWho, int requestCode) {
synchronized (mGlobalLock) {
final long origId = Binder.clearCallingIdentity();
- ActivityRecord r = ActivityRecord.isInStackLocked(token);
- if (r != null) {
- r.getActivityStack().finishSubActivityLocked(r, resultWho, requestCode);
+ try {
+ ActivityRecord r = ActivityRecord.isInStackLocked(token);
+ if (r == null) return;
+
+ final PooledConsumer c = PooledLambda.obtainConsumer(
+ ActivityRecord::finishIfSubActivity, PooledLambda.__(ActivityRecord.class),
+ r, resultWho, requestCode);
+ // TODO: This should probably only loop over the task since you need to be in the
+ // same task to return results.
+ r.getActivityStack().forAllActivities(c);
+ c.recycle();
+
+ updateOomAdj();
+ } finally {
+ Binder.restoreCallingIdentity(origId);
}
- Binder.restoreCallingIdentity(origId);
}
}
@@ -2561,7 +2586,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
synchronized (mGlobalLock) {
ActivityStack stack = ActivityRecord.getStackLocked(token);
if (stack != null) {
- return stack.willActivityBeVisibleLocked(token);
+ return stack.willActivityBeVisible(token);
}
return false;
}
@@ -3332,7 +3357,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
final long origId = Binder.clearCallingIdentity();
try {
final WindowProcessController app = getProcessController(appInt);
- mRootActivityContainer.releaseSomeActivitiesLocked(app, "low-mem");
+ app.releaseSomeActivities("low-mem");
} finally {
Binder.restoreCallingIdentity(origId);
}
@@ -5545,7 +5570,8 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
}
void updateOomAdj() {
- mH.post(mAmInternal::updateOomAdj);
+ mH.removeCallbacks(mUpdateOomAdjRunnable);
+ mH.post(mUpdateOomAdjRunnable);
}
void updateCpuStats() {
diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java
index 283b92c8e478..b046b08247a0 100644
--- a/services/core/java/com/android/server/wm/DisplayContent.java
+++ b/services/core/java/com/android/server/wm/DisplayContent.java
@@ -2482,7 +2482,7 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo
&& !mDividerControllerLocked.isImeHideRequested();
final ActivityStack dockedStack = getSplitScreenPrimaryStack();
final boolean dockVisible = dockedStack != null;
- final Task topDockedTask = dockVisible ? dockedStack.getTopChild() : null;
+ final Task topDockedTask = dockVisible ? dockedStack.getTask((t) -> true): null;
final ActivityStack imeTargetStack = mWmService.getImeFocusStackLocked();
final int imeDockSide = (dockVisible && imeTargetStack != null) ?
imeTargetStack.getDockSide() : DOCKED_INVALID;
diff --git a/services/core/java/com/android/server/wm/KeyguardController.java b/services/core/java/com/android/server/wm/KeyguardController.java
index 3b58eca2ecb9..7645de5dac74 100644
--- a/services/core/java/com/android/server/wm/KeyguardController.java
+++ b/services/core/java/com/android/server/wm/KeyguardController.java
@@ -196,8 +196,7 @@ class KeyguardController {
// Some stack visibility might change (e.g. docked stack)
mRootActivityContainer.resumeFocusedStacksTopActivities();
mRootActivityContainer.ensureActivitiesVisible(null, 0, !PRESERVE_WINDOWS);
- mRootActivityContainer.addStartingWindowsForVisibleActivities(
- true /* taskSwitch */);
+ mRootActivityContainer.addStartingWindowsForVisibleActivities();
mWindowManager.executeAppTransition();
} finally {
mService.continueWindowLayout();
diff --git a/services/core/java/com/android/server/wm/RecentsAnimation.java b/services/core/java/com/android/server/wm/RecentsAnimation.java
index 824a3c8193d2..f2e9505076a3 100644
--- a/services/core/java/com/android/server/wm/RecentsAnimation.java
+++ b/services/core/java/com/android/server/wm/RecentsAnimation.java
@@ -42,6 +42,8 @@ import android.os.Trace;
import android.util.Slog;
import android.view.IRecentsAnimationRunner;
+import com.android.internal.util.function.pooled.PooledLambda;
+import com.android.internal.util.function.pooled.PooledPredicate;
import com.android.server.protolog.common.ProtoLog;
import com.android.server.wm.RecentsAnimationController.RecentsAnimationCallbacks;
@@ -490,13 +492,15 @@ class RecentsAnimation implements RecentsAnimationCallbacks,
return null;
}
- for (int i = targetStack.getChildCount() - 1; i >= 0; i--) {
- final Task task = targetStack.getChildAt(i);
- if (task.mUserId == mUserId
- && task.getBaseIntent().getComponent().equals(mTargetIntent.getComponent())) {
- return task.getTopNonFinishingActivity();
- }
- }
- return null;
+ final PooledPredicate p = PooledLambda.obtainPredicate(RecentsAnimation::matchesTarget,
+ this, PooledLambda.__(Task.class));
+ final Task task = targetStack.getTask(p);
+ p.recycle();
+ return task != null ? task.getTopNonFinishingActivity() : null;
+ }
+
+ private boolean matchesTarget(Task task) {
+ return task.mUserId == mUserId
+ && task.getBaseIntent().getComponent().equals(mTargetIntent.getComponent());
}
}
diff --git a/services/core/java/com/android/server/wm/RecentsAnimationController.java b/services/core/java/com/android/server/wm/RecentsAnimationController.java
index 282144e50510..4c5ca38b02c4 100644
--- a/services/core/java/com/android/server/wm/RecentsAnimationController.java
+++ b/services/core/java/com/android/server/wm/RecentsAnimationController.java
@@ -55,6 +55,9 @@ import android.view.SurfaceControl;
import android.view.SurfaceControl.Transaction;
import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.util.function.pooled.PooledConsumer;
+import com.android.internal.util.function.pooled.PooledFunction;
+import com.android.internal.util.function.pooled.PooledLambda;
import com.android.server.LocalServices;
import com.android.server.inputmethod.InputMethodManagerInternal;
import com.android.server.protolog.common.ProtoLog;
@@ -369,13 +372,13 @@ public class RecentsAnimationController implements DeathRecipient {
final ActivityStack targetStack = mDisplayContent.getStack(WINDOWING_MODE_UNDEFINED,
targetActivityType);
if (targetStack != null) {
- for (int i = targetStack.getChildCount() - 1; i >= 0; i--) {
- final Task t = targetStack.getChildAt(i);
- if (!visibleTasks.contains(t)) {
- visibleTasks.add(t);
- }
- }
+ final PooledConsumer c = PooledLambda.obtainConsumer((t, outList) ->
+ { if (!outList.contains(t)) outList.add(t); }, PooledLambda.__(Task.class),
+ visibleTasks);
+ targetStack.forAllTasks(c);
+ c.recycle();
}
+
final int taskCount = visibleTasks.size();
for (int i = 0; i < taskCount; i++) {
final Task task = visibleTasks.get(i);
@@ -800,12 +803,12 @@ public class RecentsAnimationController implements DeathRecipient {
private boolean isAnimatingApp(ActivityRecord activity) {
for (int i = mPendingAnimations.size() - 1; i >= 0; i--) {
final Task task = mPendingAnimations.get(i).mTask;
- for (int j = task.getChildCount() - 1; j >= 0; j--) {
- final ActivityRecord app = task.getChildAt(j);
- if (app == activity) {
- return true;
- }
- }
+ final PooledFunction f = PooledLambda.obtainFunction(
+ (a, b) -> a == b, activity,
+ PooledLambda.__(ActivityRecord.class));
+ boolean isAnimatingApp = task.forAllActivities(f);
+ f.recycle();
+ return isAnimatingApp;
}
return false;
}
diff --git a/services/core/java/com/android/server/wm/ResetTargetTaskHelper.java b/services/core/java/com/android/server/wm/ResetTargetTaskHelper.java
index 413dfd5eac97..3aa91d52a47d 100644
--- a/services/core/java/com/android/server/wm/ResetTargetTaskHelper.java
+++ b/services/core/java/com/android/server/wm/ResetTargetTaskHelper.java
@@ -125,8 +125,7 @@ class ResetTargetTaskHelper {
// TODO: We should probably look for other stacks also, since corresponding
// task with the same affinity is unlikely to be in the same stack.
final Task targetTask;
- final ActivityRecord bottom = mParent.getActivity(
- (ar) -> true, false /*traverseTopToBottom*/);
+ final ActivityRecord bottom = mParent.getBottomMostActivity();
if (bottom != null && r.taskAffinity.equals(bottom.getTask().affinity)) {
// If the activity currently at the bottom has the same task affinity as
@@ -210,10 +209,8 @@ class ResetTargetTaskHelper {
// we have put it on top of another instance of the same activity? Then we drop
// the instance below so it remains singleTop.
if (r.info.launchMode == ActivityInfo.LAUNCH_SINGLE_TOP) {
- final ArrayList<ActivityRecord> taskActivities = mTargetTask.mChildren;
- final int targetNdx = taskActivities.indexOf(r);
- if (targetNdx > 0) {
- final ActivityRecord p = taskActivities.get(targetNdx - 1);
+ final ActivityRecord p = mTargetTask.getActivityBelow(r);
+ if (p != null) {
if (p.intent.getComponent().equals(r.intent.getComponent())) {
p.finishIfPossible("replace", false /* oomAdj */);
}
diff --git a/services/core/java/com/android/server/wm/RootActivityContainer.java b/services/core/java/com/android/server/wm/RootActivityContainer.java
index 8f1d6eea767b..5fd59fa5ab6e 100644
--- a/services/core/java/com/android/server/wm/RootActivityContainer.java
+++ b/services/core/java/com/android/server/wm/RootActivityContainer.java
@@ -33,6 +33,7 @@ import static android.content.pm.ActivityInfo.LAUNCH_SINGLE_INSTANCE;
import static android.content.pm.ActivityInfo.LAUNCH_SINGLE_TASK;
import static android.view.Display.DEFAULT_DISPLAY;
import static android.view.Display.INVALID_DISPLAY;
+import static android.view.WindowManager.TRANSIT_CRASHING_ACTIVITY_CLOSE;
import static android.view.WindowManager.TRANSIT_SHOW_SINGLE_TASK_DISPLAY;
import static com.android.server.am.ActivityStackSupervisorProto.CONFIGURATION_CONTAINER;
@@ -86,6 +87,7 @@ import android.graphics.Rect;
import android.hardware.display.DisplayManager;
import android.hardware.display.DisplayManagerInternal;
import android.hardware.power.V1_0.PowerHint;
+import android.net.Uri;
import android.os.FactoryTest;
import android.os.IBinder;
import android.os.RemoteException;
@@ -108,6 +110,11 @@ import android.view.DisplayInfo;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.app.ResolverActivity;
+import com.android.internal.util.ToBooleanFunction;
+import com.android.internal.util.function.pooled.PooledConsumer;
+import com.android.internal.util.function.pooled.PooledFunction;
+import com.android.internal.util.function.pooled.PooledLambda;
+import com.android.internal.util.function.pooled.PooledPredicate;
import com.android.server.LocalServices;
import com.android.server.am.ActivityManagerService;
import com.android.server.am.AppTimeTracker;
@@ -121,6 +128,7 @@ import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
+import java.util.Objects;
import java.util.Set;
/**
@@ -201,14 +209,46 @@ class RootActivityContainer extends ConfigurationContainer
// Whether tasks have moved and we need to rank the tasks before next OOM scoring
private boolean mTaskLayersChanged = true;
+ private int mTmpTaskLayerRank;
- private final ArrayList<ActivityRecord> mTmpActivityList = new ArrayList<>();
+ private boolean mTmpBoolean;
+ private RemoteException mTmpRemoteException;
private final FindTaskResult mTmpFindTaskResult = new FindTaskResult();
- static class FindTaskResult {
+ static class FindTaskResult implements ToBooleanFunction<Task> {
ActivityRecord mRecord;
boolean mIdealMatch;
+ private ActivityRecord mTarget;
+ private Intent intent;
+ private ActivityInfo info;
+ private ComponentName cls;
+ private int userId;
+ private boolean isDocument;
+ private Uri documentData;
+
+ /**
+ * Returns the top activity in any existing task matching the given Intent in the input
+ * result. Returns null if no such task is found.
+ */
+ void process(ActivityRecord target, ActivityStack parent) {
+ mTarget = target;
+
+ intent = target.intent;
+ info = target.info;
+ cls = intent.getComponent();
+ if (info.targetActivity != null) {
+ cls = new ComponentName(info.packageName, info.targetActivity);
+ }
+ userId = UserHandle.getUserId(info.applicationInfo.uid);
+ isDocument = intent != null & intent.isDocument();
+ // If documentData is non-null then it must match the existing task data.
+ documentData = isDocument ? intent.getData() : null;
+
+ if (DEBUG_TASKS) Slog.d(TAG_TASKS, "Looking for task of " + target + " in " + parent);
+ parent.forAllTasks(this);
+ }
+
void clear() {
mRecord = null;
mIdealMatch = false;
@@ -218,6 +258,84 @@ class RootActivityContainer extends ConfigurationContainer
mRecord = result.mRecord;
mIdealMatch = result.mIdealMatch;
}
+
+ @Override
+ public boolean apply(Task task) {
+ if (task.voiceSession != null) {
+ // We never match voice sessions; those always run independently.
+ if (DEBUG_TASKS) Slog.d(TAG_TASKS, "Skipping " + task + ": voice session");
+ return false;
+ }
+ if (task.mUserId != userId) {
+ // Looking for a different task.
+ if (DEBUG_TASKS) Slog.d(TAG_TASKS, "Skipping " + task + ": different user");
+ return false;
+ }
+
+ // Overlays should not be considered as the task's logical top activity.
+ final ActivityRecord r = task.getTopNonFinishingActivity(false /* includeOverlays */);
+ if (r == null || r.finishing || r.mUserId != userId ||
+ r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) {
+ if (DEBUG_TASKS) Slog.d(TAG_TASKS, "Skipping " + task + ": mismatch root " + r);
+ return false;
+ }
+ if (!r.hasCompatibleActivityType(mTarget)) {
+ if (DEBUG_TASKS) Slog.d(TAG_TASKS, "Skipping " + task + ": mismatch activity type");
+ return false;
+ }
+
+ final Intent taskIntent = task.intent;
+ final Intent affinityIntent = task.affinityIntent;
+ final boolean taskIsDocument;
+ final Uri taskDocumentData;
+ if (taskIntent != null && taskIntent.isDocument()) {
+ taskIsDocument = true;
+ taskDocumentData = taskIntent.getData();
+ } else if (affinityIntent != null && affinityIntent.isDocument()) {
+ taskIsDocument = true;
+ taskDocumentData = affinityIntent.getData();
+ } else {
+ taskIsDocument = false;
+ taskDocumentData = null;
+ }
+
+ if (DEBUG_TASKS) Slog.d(TAG_TASKS, "Comparing existing cls="
+ + (task.realActivity != null ? task.realActivity.flattenToShortString() : "")
+ + "/aff=" + r.getTask().rootAffinity + " to new cls="
+ + intent.getComponent().flattenToShortString() + "/aff=" + info.taskAffinity);
+ // TODO Refactor to remove duplications. Check if logic can be simplified.
+ if (task.realActivity != null && task.realActivity.compareTo(cls) == 0
+ && Objects.equals(documentData, taskDocumentData)) {
+ if (DEBUG_TASKS) Slog.d(TAG_TASKS, "Found matching class!");
+ //dump();
+ if (DEBUG_TASKS) Slog.d(TAG_TASKS,
+ "For Intent " + intent + " bringing to top: " + r.intent);
+ mRecord = r;
+ mIdealMatch = true;
+ return true;
+ } else if (affinityIntent != null && affinityIntent.getComponent() != null &&
+ affinityIntent.getComponent().compareTo(cls) == 0 &&
+ Objects.equals(documentData, taskDocumentData)) {
+ if (DEBUG_TASKS) Slog.d(TAG_TASKS, "Found matching class!");
+ if (DEBUG_TASKS) Slog.d(TAG_TASKS,
+ "For Intent " + intent + " bringing to top: " + r.intent);
+ mRecord = r;
+ mIdealMatch = true;
+ return true;
+ } else if (!isDocument && !taskIsDocument
+ && mRecord == null && task.rootAffinity != null) {
+ if (task.rootAffinity.equals(mTarget.taskAffinity)) {
+ if (DEBUG_TASKS) Slog.d(TAG_TASKS, "Found matching affinity candidate!");
+ // It is possible for multiple tasks to have the same root affinity especially
+ // if they are in separate stacks. We save off this candidate, but keep looking
+ // to see if there is a better candidate.
+ mRecord = r;
+ mIdealMatch = false;
+ }
+ } else if (DEBUG_TASKS) Slog.d(TAG_TASKS, "Not a match: " + task);
+
+ return false;
+ }
}
RootActivityContainer(ActivityTaskManagerService service) {
@@ -772,27 +890,21 @@ class RootActivityContainer extends ConfigurationContainer
for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
final ActivityDisplay display = mActivityDisplays.get(displayNdx);
final ActivityStack stack = display.getFocusedStack();
- if (stack != null) {
- stack.getAllRunningVisibleActivitiesLocked(mTmpActivityList);
- final ActivityRecord top = stack.topRunningActivityLocked();
- final int size = mTmpActivityList.size();
- for (int i = 0; i < size; i++) {
- final ActivityRecord activity = mTmpActivityList.get(i);
- if (activity.app == null && app.mUid == activity.info.applicationInfo.uid
- && processName.equals(activity.processName)) {
- try {
- if (mStackSupervisor.realStartActivityLocked(activity, app,
- top == activity /* andResume */, true /* checkConfig */)) {
- didSomething = true;
- }
- } catch (RemoteException e) {
- Slog.w(TAG, "Exception in new application when starting activity "
- + top.intent.getComponent().flattenToShortString(), e);
- throw e;
- }
- }
- }
+ if (stack == null) {
+ continue;
}
+
+ mTmpRemoteException = null;
+ mTmpBoolean = false; // Set to true if an activity was started.
+ final PooledFunction c = PooledLambda.obtainFunction(
+ RootActivityContainer::startActivityForAttachedApplicationIfNeeded, this,
+ PooledLambda.__(ActivityRecord.class), app, stack.topRunningActivityLocked());
+ stack.forAllActivities(c);
+ c.recycle();
+ if (mTmpRemoteException != null) {
+ throw mTmpRemoteException;
+ }
+ didSomething |= mTmpBoolean;
}
if (!didSomething) {
ensureActivitiesVisible(null, 0, false /* preserve_windows */);
@@ -800,6 +912,27 @@ class RootActivityContainer extends ConfigurationContainer
return didSomething;
}
+ private boolean startActivityForAttachedApplicationIfNeeded(ActivityRecord r,
+ WindowProcessController app, ActivityRecord top) {
+ if (r.finishing || !r.okToShowLocked() || !r.visibleIgnoringKeyguard || r.app != null
+ || app.mUid != r.info.applicationInfo.uid || !app.mName.equals(r.processName)) {
+ return false;
+ }
+
+ try {
+ if (mStackSupervisor.realStartActivityLocked(r, app, top == r /*andResume*/,
+ true /*checkConfig*/)) {
+ mTmpBoolean = true;
+ }
+ } catch (RemoteException e) {
+ Slog.w(TAG, "Exception in new application when starting activity "
+ + top.intent.getComponent().flattenToShortString(), e);
+ mTmpRemoteException = e;
+ return true;
+ }
+ return false;
+ }
+
/**
* Make sure that all activities that need to be visible in the system actually are and update
* their configuration.
@@ -1526,14 +1659,12 @@ class RootActivityContainer extends ConfigurationContainer
}
}
- void addStartingWindowsForVisibleActivities(boolean taskSwitch) {
- for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
- final ActivityDisplay display = mActivityDisplays.get(displayNdx);
- for (int stackNdx = display.getChildCount() - 1; stackNdx >= 0; --stackNdx) {
- final ActivityStack stack = display.getChildAt(stackNdx);
- stack.addStartingWindowsForVisibleActivities(taskSwitch);
+ void addStartingWindowsForVisibleActivities() {
+ mRootWindowContainer.forAllActivities((r) -> {
+ if (r.mVisibleRequested) {
+ r.showStartingWindow(null /* prev */, false /* newTask */, true /*taskSwitch*/);
}
- }
+ });
}
void invalidateTaskLayers() {
@@ -1541,27 +1672,37 @@ class RootActivityContainer extends ConfigurationContainer
}
void rankTaskLayersIfNeeded() {
- if (!mTaskLayersChanged) {
+ if (!mTaskLayersChanged || mRootWindowContainer == null) {
return;
}
mTaskLayersChanged = false;
- for (int displayNdx = 0; displayNdx < mActivityDisplays.size(); displayNdx++) {
- final ActivityDisplay display = mActivityDisplays.get(displayNdx);
- int baseLayer = 0;
- for (int stackNdx = display.getChildCount() - 1; stackNdx >= 0; --stackNdx) {
- final ActivityStack stack = display.getChildAt(stackNdx);
- baseLayer += stack.rankTaskLayers(baseLayer);
- }
+ mTmpTaskLayerRank = 0;
+ final PooledConsumer c = PooledLambda.obtainConsumer(
+ RootActivityContainer::rankTaskLayerForActivity, this,
+ PooledLambda.__(ActivityRecord.class));
+ mRootWindowContainer.forAllActivities(c);
+ c.recycle();
+ }
+
+ private void rankTaskLayerForActivity(ActivityRecord r) {
+ if (r.canBeTopRunning() && r.mVisibleRequested) {
+ r.getTask().mLayerRank = ++mTmpTaskLayerRank;
+ } else {
+ r.getTask().mLayerRank = -1;
}
}
void clearOtherAppTimeTrackers(AppTimeTracker except) {
- for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
- final ActivityDisplay display = mActivityDisplays.get(displayNdx);
- for (int stackNdx = display.getChildCount() - 1; stackNdx >= 0; --stackNdx) {
- final ActivityStack stack = display.getChildAt(stackNdx);
- stack.clearOtherAppTimeTrackers(except);
- }
+ final PooledConsumer c = PooledLambda.obtainConsumer(
+ RootActivityContainer::clearOtherAppTimeTrackers,
+ PooledLambda.__(ActivityRecord.class), except);
+ mRootWindowContainer.forAllActivities(c);
+ c.recycle();
+ }
+
+ private static void clearOtherAppTimeTrackers(ActivityRecord r, AppTimeTracker except) {
+ if ( r.appTimeTracker != except) {
+ r.appTimeTracker = null;
}
}
@@ -1575,30 +1716,6 @@ class RootActivityContainer extends ConfigurationContainer
}
}
- void releaseSomeActivitiesLocked(WindowProcessController app, String reason) {
- // Tasks is non-null only if two or more tasks are found.
- ArraySet<Task> tasks = app.getReleaseSomeActivitiesTasks();
- if (tasks == null) {
- if (DEBUG_RELEASE) Slog.d(TAG_RELEASE, "Didn't find two or more tasks to release");
- return;
- }
- // If we have activities in multiple tasks that are in a position to be destroyed,
- // let's iterate through the tasks and release the oldest one.
- final int numDisplays = mActivityDisplays.size();
- for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) {
- final ActivityDisplay display = mActivityDisplays.get(displayNdx);
- final int stackCount = display.getChildCount();
- // Step through all stacks starting from behind, to hit the oldest things first.
- for (int stackNdx = 0; stackNdx < stackCount; stackNdx++) {
- final ActivityStack stack = display.getChildAt(stackNdx);
- // Try to release activities in this stack; if we manage to, we are done.
- if (stack.releaseSomeActivitiesLocked(app, tasks, reason) > 0) {
- return;
- }
- }
- }
- }
-
// Tries to put all activity stacks to sleep. Returns true if all stacks were
// successfully put to sleep.
boolean putStacksToSleep(boolean allowDelay, boolean shuttingDown) {
@@ -1625,28 +1742,52 @@ class RootActivityContainer extends ConfigurationContainer
}
void handleAppCrash(WindowProcessController app) {
- for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
- final ActivityDisplay display = mActivityDisplays.get(displayNdx);
- for (int stackNdx = display.getChildCount() - 1; stackNdx >= 0; --stackNdx) {
- final ActivityStack stack = display.getChildAt(stackNdx);
- stack.handleAppCrash(app);
- }
- }
+ final PooledConsumer c = PooledLambda.obtainConsumer(
+ RootActivityContainer::handleAppCrash, PooledLambda.__(ActivityRecord.class), app);
+ mRootWindowContainer.forAllActivities(c);
+ c.recycle();
+ }
+
+ private static void handleAppCrash(ActivityRecord r, WindowProcessController app) {
+ if (r.app != app) return;
+ Slog.w(TAG, " Force finishing activity "
+ + r.intent.getComponent().flattenToShortString());
+ // Force the destroy to skip right to removal.
+ r.app = null;
+ r.getDisplay().mDisplayContent.prepareAppTransition(
+ TRANSIT_CRASHING_ACTIVITY_CLOSE, false /* alwaysKeepCurrent */);
+ r.destroyIfPossible("handleAppCrashed");
}
ActivityRecord findActivity(Intent intent, ActivityInfo info, boolean compareIntentFilters) {
- for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
- final ActivityDisplay display = mActivityDisplays.get(displayNdx);
- for (int stackNdx = display.getChildCount() - 1; stackNdx >= 0; --stackNdx) {
- final ActivityStack stack = display.getChildAt(stackNdx);
- final ActivityRecord ar = stack.findActivityLocked(
- intent, info, compareIntentFilters);
- if (ar != null) {
- return ar;
- }
+ ComponentName cls = intent.getComponent();
+ if (info.targetActivity != null) {
+ cls = new ComponentName(info.packageName, info.targetActivity);
+ }
+ final int userId = UserHandle.getUserId(info.applicationInfo.uid);
+
+ final PooledPredicate p = PooledLambda.obtainPredicate(
+ RootActivityContainer::matchesActivity, PooledLambda.__(ActivityRecord.class),
+ userId, compareIntentFilters, intent, cls);
+ final ActivityRecord r = mRootWindowContainer.getActivity(p);
+ p.recycle();
+ return r;
+ }
+
+ private static boolean matchesActivity(ActivityRecord r, int userId,
+ boolean compareIntentFilters, Intent intent, ComponentName cls) {
+ if (!r.canBeTopRunning() || r.mUserId != userId) return false;
+
+ if (compareIntentFilters) {
+ if (r.intent.filterEquals(intent)) {
+ return true;
+ }
+ } else {
+ if (r.intent.getComponent().equals(cls)) {
+ return true;
}
}
- return null;
+ return false;
}
boolean hasAwakeDisplay() {
@@ -1978,39 +2119,104 @@ class RootActivityContainer extends ConfigurationContainer
}
void closeSystemDialogs() {
- for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
- final ActivityDisplay display = mActivityDisplays.get(displayNdx);
- for (int stackNdx = display.getChildCount() - 1; stackNdx >= 0; --stackNdx) {
- final ActivityStack stack = display.getChildAt(stackNdx);
- stack.closeSystemDialogsLocked();
+ mRootWindowContainer.forAllActivities((r) -> {
+ if ((r.info.flags & ActivityInfo.FLAG_FINISH_ON_CLOSE_SYSTEM_DIALOGS) != 0) {
+ r.finishIfPossible("close-sys", true /* oomAdj */);
+ }
+ });
+ }
+
+ FinishDisabledPackageActivitiesHelper mFinishDisabledPackageActivitiesHelper =
+ new FinishDisabledPackageActivitiesHelper();
+ class FinishDisabledPackageActivitiesHelper {
+ private boolean mDidSomething;
+ private String mPackageName;
+ private Set<String> mFilterByClasses;
+ private boolean mDoit;
+ private boolean mEvenPersistent;
+ private int mUserId;
+ private Task mLastTask;
+ private ComponentName mHomeActivity;
+
+ private void reset(String packageName, Set<String> filterByClasses,
+ boolean doit, boolean evenPersistent, int userId) {
+ mDidSomething = false;
+ mPackageName = packageName;
+ mFilterByClasses = filterByClasses;
+ mDoit = doit;
+ mEvenPersistent = evenPersistent;
+ mUserId = userId;
+ mLastTask = null;
+ mHomeActivity = null;
+ }
+
+ boolean process(String packageName, Set<String> filterByClasses,
+ boolean doit, boolean evenPersistent, int userId) {
+ reset(packageName, filterByClasses, doit, evenPersistent, userId);
+
+ final PooledFunction f = PooledLambda.obtainFunction(
+ FinishDisabledPackageActivitiesHelper::processActivity, this,
+ PooledLambda.__(ActivityRecord.class));
+ mRootWindowContainer.forAllActivities(f);
+ f.recycle();
+ return mDidSomething;
+ }
+
+ private boolean processActivity(ActivityRecord r) {
+ final boolean sameComponent =
+ (r.packageName.equals(mPackageName) && (mFilterByClasses == null
+ || mFilterByClasses.contains(r.mActivityComponent.getClassName())))
+ || (mPackageName == null && r.mUserId == mUserId);
+ if ((mUserId == UserHandle.USER_ALL || r.mUserId == mUserId)
+ && (sameComponent || r.getTask() == mLastTask)
+ && (r.app == null || mEvenPersistent || !r.app.isPersistent())) {
+ if (!mDoit) {
+ if (r.finishing) {
+ // If this activity is just finishing, then it is not
+ // interesting as far as something to stop.
+ return false;
+ }
+ return true;
+ }
+ if (r.isActivityTypeHome()) {
+ if (mHomeActivity != null && mHomeActivity.equals(r.mActivityComponent)) {
+ Slog.i(TAG, "Skip force-stop again " + r);
+ return false;
+ } else {
+ mHomeActivity = r.mActivityComponent;
+ }
+ }
+ mDidSomething = true;
+ Slog.i(TAG, " Force finishing activity " + r);
+ mLastTask = r.getTask();
+ r.finishIfPossible("force-stop", true);
}
+
+ return false;
}
}
/** @return true if some activity was finished (or would have finished if doit were true). */
boolean finishDisabledPackageActivities(String packageName, Set<String> filterByClasses,
boolean doit, boolean evenPersistent, int userId) {
- boolean didSomething = false;
- for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
- final ActivityDisplay display = mActivityDisplays.get(displayNdx);
- for (int stackNdx = display.getChildCount() - 1; stackNdx >= 0; --stackNdx) {
- final ActivityStack stack = display.getChildAt(stackNdx);
- if (stack.finishDisabledPackageActivitiesLocked(
- packageName, filterByClasses, doit, evenPersistent, userId)) {
- didSomething = true;
- }
- }
- }
- return didSomething;
+ return mFinishDisabledPackageActivitiesHelper.process(packageName, filterByClasses, doit,
+ evenPersistent, userId);
}
void updateActivityApplicationInfo(ApplicationInfo aInfo) {
- for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
- final ActivityDisplay display = mActivityDisplays.get(displayNdx);
- for (int stackNdx = display.getChildCount() - 1; stackNdx >= 0; --stackNdx) {
- final ActivityStack stack = display.getChildAt(stackNdx);
- stack.updateActivityApplicationInfoLocked(aInfo);
- }
+ final String packageName = aInfo.packageName;
+ final int userId = UserHandle.getUserId(aInfo.uid);
+ final PooledConsumer c = PooledLambda.obtainConsumer(
+ RootActivityContainer::updateActivityApplicationInfo,
+ PooledLambda.__(ActivityRecord.class), aInfo, userId, packageName);
+ mRootWindowContainer.forAllActivities(c);
+ c.recycle();
+ }
+
+ private static void updateActivityApplicationInfo(
+ ActivityRecord r, ApplicationInfo aInfo, int userId, String packageName) {
+ if (r.mUserId == userId && packageName.equals(r.packageName)) {
+ r.updateApplicationInfo(aInfo);
}
}
@@ -2063,7 +2269,7 @@ class RootActivityContainer extends ConfigurationContainer
// If the focused stack is not null or not empty, there should have some activities
// resuming or resumed. Make sure these activities are idle.
final ActivityStack stack = display.getFocusedStack();
- if (stack == null || stack.numActivities() == 0) {
+ if (stack == null || !stack.hasActivity()) {
continue;
}
final ActivityRecord resumedActivity = stack.getResumedActivity();
diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java
index 619b71cd751a..88a38e02de6a 100644
--- a/services/core/java/com/android/server/wm/Task.java
+++ b/services/core/java/com/android/server/wm/Task.java
@@ -67,7 +67,6 @@ import static com.android.server.am.TaskRecordProto.REAL_ACTIVITY;
import static com.android.server.am.TaskRecordProto.RESIZE_MODE;
import static com.android.server.am.TaskRecordProto.STACK_ID;
import static com.android.server.am.TaskRecordProto.TASK;
-import static com.android.server.wm.ActivityRecord.FINISH_RESULT_REMOVED;
import static com.android.server.wm.ActivityRecord.STARTING_WINDOW_SHOWN;
import static com.android.server.wm.ActivityStackSupervisor.ON_TOP;
import static com.android.server.wm.ActivityStackSupervisor.PRESERVE_WINDOWS;
@@ -138,6 +137,10 @@ import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.app.IVoiceInteractor;
import com.android.internal.util.ToBooleanFunction;
import com.android.internal.util.XmlUtils;
+import com.android.internal.util.function.pooled.PooledConsumer;
+import com.android.internal.util.function.pooled.PooledFunction;
+import com.android.internal.util.function.pooled.PooledLambda;
+import com.android.internal.util.function.pooled.PooledPredicate;
import com.android.server.protolog.common.ProtoLog;
import com.android.server.wm.ActivityStack.ActivityState;
@@ -152,8 +155,9 @@ import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
import java.util.Objects;
import java.util.function.Consumer;
+import java.util.function.Predicate;
-class Task extends WindowContainer<ActivityRecord> implements ConfigurationContainerListener {
+class Task extends WindowContainer<WindowContainer> {
private static final String TAG = TAG_WITH_CLASS_NAME ? "Task" : TAG_ATM;
private static final String TAG_ADD_REMOVE = TAG + POSTFIX_ADD_REMOVE;
private static final String TAG_RECENTS = TAG + POSTFIX_RECENTS;
@@ -382,6 +386,44 @@ class Task extends WindowContainer<ActivityRecord> implements ConfigurationConta
/** @see #setCanAffectSystemUiFlags */
private boolean mCanAffectSystemUiFlags = true;
+ private static Exception sTmpException;
+
+ private final FindRootHelper mFindRootHelper = new FindRootHelper();
+ private class FindRootHelper {
+ private ActivityRecord mRoot;
+
+ private void clear() {
+ mRoot = null;
+ }
+
+ ActivityRecord findRoot(boolean ignoreRelinquishIdentity, boolean setToBottomIfNone) {
+ final PooledFunction f = PooledLambda.obtainFunction(FindRootHelper::processActivity,
+ this, PooledLambda.__(ActivityRecord.class), ignoreRelinquishIdentity,
+ setToBottomIfNone);
+ clear();
+ forAllActivities(f, false /*traverseTopToBottom*/);
+ f.recycle();
+ return mRoot;
+ }
+
+ private boolean processActivity(ActivityRecord r,
+ boolean ignoreRelinquishIdentity, boolean setToBottomIfNone) {
+ if (mRoot == null && setToBottomIfNone) {
+ // This is the first activity we are process. Set it as the candidate root in case
+ // we don't find a better one.
+ mRoot = r;
+ }
+
+ if (r.finishing) return false;
+
+ // Set this as the candidate root since it isn't finishing.
+ mRoot = r;
+
+ // Only end search if we are ignore relinquishing identity or we are not relinquishing.
+ return ignoreRelinquishIdentity || (r.info.flags & FLAG_RELINQUISH_TASK_IDENTITY) == 0;
+ }
+ }
+
/**
* Don't use constructor directly. Use {@link #create(ActivityTaskManagerService, int,
* ActivityInfo, Intent, TaskDescription)} instead.
@@ -464,7 +506,7 @@ class Task extends WindowContainer<ActivityRecord> implements ConfigurationConta
mAtmService.getTaskChangeNotificationController().notifyTaskCreated(_taskId, realActivity);
}
- void cleanUpResourcesForDestroy() {
+ private void cleanUpResourcesForDestroy() {
if (hasChild()) {
return;
}
@@ -931,10 +973,11 @@ class Task extends WindowContainer<ActivityRecord> implements ConfigurationConta
super.onParentChanged(newParent, oldParent);
if (oldStack != null) {
- for (int i = getChildCount() - 1; i >= 0; --i) {
- final ActivityRecord activity = getChildAt(i);
- oldStack.onActivityRemovedFromStack(activity);
- }
+ final PooledConsumer c = PooledLambda.obtainConsumer(
+ ActivityStack::onActivityRemovedFromStack, oldStack,
+ PooledLambda.__(ActivityRecord.class));
+ forAllActivities(c);
+ c.recycle();
if (oldStack.inPinnedWindowingMode()
&& (newStack == null || !newStack.inPinnedWindowingMode())) {
@@ -945,10 +988,11 @@ class Task extends WindowContainer<ActivityRecord> implements ConfigurationConta
}
if (newStack != null) {
- for (int i = getChildCount() - 1; i >= 0; --i) {
- final ActivityRecord activity = getChildAt(i);
- newStack.onActivityAddedToStack(activity);
- }
+ final PooledConsumer c = PooledLambda.obtainConsumer(
+ ActivityStack::onActivityAddedToStack, newStack,
+ PooledLambda.__(ActivityRecord.class));
+ forAllActivities(c);
+ c.recycle();
// TODO: Ensure that this is actually necessary here
// Notify the voice session if required
@@ -1068,25 +1112,11 @@ class Task extends WindowContainer<ActivityRecord> implements ConfigurationConta
}
ActivityRecord getRootActivity(boolean setToBottomIfNone) {
- return getRootActivity(false /*ignoreRelinquishIdentity*/, false /*setToBottomIfNone*/);
+ return getRootActivity(false /*ignoreRelinquishIdentity*/, setToBottomIfNone);
}
ActivityRecord getRootActivity(boolean ignoreRelinquishIdentity, boolean setToBottomIfNone) {
- ActivityRecord root;
- if (ignoreRelinquishIdentity) {
- root = getActivity((r) -> !r.finishing, false /*traverseTopToBottom*/);
- } else {
- root = getActivity((r) ->
- !r.finishing && (r.info.flags & FLAG_RELINQUISH_TASK_IDENTITY) == 0,
- false /*traverseTopToBottom*/);
- }
-
- if (root == null && setToBottomIfNone) {
- // All activities in the task are either finishing or relinquish task identity.
- // But we still want to update the intent, so let's use the bottom activity.
- root = getActivity((r) -> true, false /*traverseTopToBottom*/);
- }
- return root;
+ return mFindRootHelper.findRoot(ignoreRelinquishIdentity, setToBottomIfNone);
}
ActivityRecord getTopNonFinishingActivity() {
@@ -1094,101 +1124,42 @@ class Task extends WindowContainer<ActivityRecord> implements ConfigurationConta
}
ActivityRecord getTopNonFinishingActivity(boolean includeOverlays) {
- for (int i = getChildCount() - 1; i >= 0; --i) {
- final ActivityRecord r = getChildAt(i);
- if (r.finishing || (!includeOverlays && r.mTaskOverlay)) {
- continue;
- }
- return r;
- }
- return null;
+ return getTopActivity(false /*includeFinishing*/, includeOverlays);
}
ActivityRecord topRunningActivityLocked() {
- if (mStack != null) {
- for (int activityNdx = getChildCount() - 1; activityNdx >= 0; --activityNdx) {
- ActivityRecord r = getChildAt(activityNdx);
- if (!r.finishing && r.okToShowLocked()) {
- return r;
- }
- }
+ if (getParent() == null) {
+ return null;
}
- return null;
+ return getActivity(ActivityRecord::canBeTopRunning);
}
/**
* Return true if any activities in this task belongs to input uid.
*/
- boolean containsAppUid(int uid) {
- for (int i = getChildCount() - 1; i >= 0; --i) {
- final ActivityRecord r = getChildAt(i);
- if (r.getUid() == uid) {
- return true;
- }
- }
- return false;
- }
-
- void getAllRunningVisibleActivitiesLocked(ArrayList<ActivityRecord> outActivities) {
- if (mStack != null) {
- for (int activityNdx = getChildCount() - 1; activityNdx >= 0; --activityNdx) {
- ActivityRecord r = getChildAt(activityNdx);
- if (!r.finishing && r.okToShowLocked() && r.visibleIgnoringKeyguard) {
- outActivities.add(r);
- }
- }
- }
+ boolean isUidPresent(int uid) {
+ final PooledPredicate p = PooledLambda.obtainPredicate(
+ ActivityRecord::isUid, PooledLambda.__(ActivityRecord.class), uid);
+ final boolean isUidPresent = getActivity(p) != null;
+ p.recycle();
+ return isUidPresent;
}
ActivityRecord topRunningActivityWithStartingWindowLocked() {
- if (mStack != null) {
- for (int activityNdx = getChildCount() - 1; activityNdx >= 0; --activityNdx) {
- ActivityRecord r = getChildAt(activityNdx);
- if (r.mStartingWindowState != STARTING_WINDOW_SHOWN
- || r.finishing || !r.okToShowLocked()) {
- continue;
- }
- return r;
- }
+ if (getParent() == null) {
+ return null;
}
- return null;
+ return getActivity((r) -> r.mStartingWindowState == STARTING_WINDOW_SHOWN
+ && r.canBeTopRunning());
}
/**
* Return the number of running activities, and the number of non-finishing/initializing
* activities in the provided {@param reportOut} respectively.
*/
- void getNumRunningActivities(TaskActivitiesReport reportOut) {
+ private void getNumRunningActivities(TaskActivitiesReport reportOut) {
reportOut.reset();
- for (int i = getChildCount() - 1; i >= 0; --i) {
- final ActivityRecord r = getChildAt(i);
- if (r.finishing) {
- continue;
- }
-
- reportOut.base = r;
-
- // Increment the total number of non-finishing activities
- reportOut.numActivities++;
-
- if (reportOut.top == null || (reportOut.top.isState(ActivityState.INITIALIZING))) {
- reportOut.top = r;
- // Reset the number of running activities until we hit the first non-initializing
- // activity
- reportOut.numRunning = 0;
- }
- if (r.attachedToProcess()) {
- // Increment the number of actually running activities
- reportOut.numRunning++;
- }
- }
- }
-
- boolean okToShowLocked() {
- // NOTE: If {@link Task#topRunningActivity} return is not null then it is
- // okay to show the activity when locked.
- return mAtmService.mStackSupervisor.isCurrentProfileLocked(mUserId)
- || topRunningActivityLocked() != null;
+ forAllActivities(reportOut);
}
/**
@@ -1212,10 +1183,11 @@ class Task extends WindowContainer<ActivityRecord> implements ConfigurationConta
}
@Override
- void addChild(ActivityRecord r, int index) {
+ void addChild(WindowContainer child, int index) {
// If this task had any child before we added this one.
boolean hadChild = hasChild();
+ final ActivityRecord r = (ActivityRecord) child;
index = getAdjustedAddPosition(r, index);
super.addChild(r, index);
@@ -1244,9 +1216,6 @@ class Task extends WindowContainer<ActivityRecord> implements ConfigurationConta
}
updateEffectiveIntent();
- if (r.isPersistable()) {
- mAtmService.notifyTaskPersisterLocked(this, false);
- }
// Make sure the list of display UID whitelists is updated
// now that this record is in a new task.
@@ -1258,16 +1227,13 @@ class Task extends WindowContainer<ActivityRecord> implements ConfigurationConta
}
@Override
- void removeChild(ActivityRecord r) {
+ void removeChild(WindowContainer r) {
if (!mChildren.contains(r)) {
Slog.e(TAG, "removeChild: r=" + r + " not found in t=" + this);
return;
}
super.removeChild(r);
- if (r.isPersistable()) {
- mAtmService.notifyTaskPersisterLocked(this, false);
- }
if (inPinnedWindowingMode()) {
// We normally notify listeners of task stack changes on pause, however pinned stack
@@ -1283,7 +1249,7 @@ class Task extends WindowContainer<ActivityRecord> implements ConfigurationConta
// The following block can be executed multiple times if there is more than one overlay.
// {@link ActivityStackSupervisor#removeTaskByIdLocked} handles this by reverse lookup
// of the task by id and exiting early if not found.
- if (onlyHasTaskOverlayActivities(false /* excludingFinishing */)) {
+ if (onlyHasTaskOverlayActivities(true /*includeFinishing*/)) {
// When destroying a task, tell the supervisor to remove it so that any activity it
// has can be cleaned up correctly. This is currently the only place where we remove
// a task with the DESTROYING mode, so instead of passing the onlyHasTaskOverlays
@@ -1305,25 +1271,20 @@ class Task extends WindowContainer<ActivityRecord> implements ConfigurationConta
/**
* @return whether or not there are ONLY task overlay activities in the stack.
- * If {@param excludeFinishing} is set, then ignore finishing activities in the check.
- * If there are no task overlay activities, this call returns false.
+ * If {@param includeFinishing} is set, then don't ignore finishing activities in the
+ * check. If there are no task overlay activities, this call returns false.
*/
- boolean onlyHasTaskOverlayActivities(boolean excludeFinishing) {
- int count = 0;
- for (int i = getChildCount() - 1; i >= 0; i--) {
- final ActivityRecord r = getChildAt(i);
- if (excludeFinishing && r.finishing) {
- continue;
- }
- if (!r.mTaskOverlay) {
- return false;
- }
- count++;
+ boolean onlyHasTaskOverlayActivities(boolean includeFinishing) {
+ if (getChildCount() == 0) {
+ return false;
}
- return count > 0;
+ if (includeFinishing) {
+ return getActivity((r) -> r.mTaskOverlay) != null;
+ }
+ return getActivity((r) -> !r.finishing && r.mTaskOverlay) != null;
}
- boolean autoRemoveFromRecents() {
+ private boolean autoRemoveFromRecents() {
// We will automatically remove the task either if it has explicitly asked for
// this, or it is empty and has never contained an activity that got shown to
// the user.
@@ -1335,24 +1296,21 @@ class Task extends WindowContainer<ActivityRecord> implements ConfigurationConta
* task starting at a specified index.
*/
private void performClearTaskAtIndexLocked(String reason) {
- int numActivities = getChildCount();
- for (int activityNdx = 0; activityNdx < numActivities; ++activityNdx) {
- final ActivityRecord r = getChildAt(activityNdx);
- if (r.finishing) {
- continue;
- }
- if (mStack == null) {
+ // Broken down into to cases to avoid object create due to capturing mStack.
+ if (mStack == null) {
+ forAllActivities((r) -> {
+ if (r.finishing) return;
// Task was restored from persistent storage.
r.takeFromHistory();
removeChild(r);
- --activityNdx;
- --numActivities;
- } else if (r.finishIfPossible(Activity.RESULT_CANCELED, null /* resultData */, reason,
- false /* oomAdj */)
- == FINISH_RESULT_REMOVED) {
- --activityNdx;
- --numActivities;
- }
+ });
+ } else {
+ forAllActivities((r) -> {
+ if (r.finishing) return;
+ // TODO: figure-out how to avoid object creation due to capture of reason variable.
+ r.finishIfPossible(Activity.RESULT_CANCELED, null /* resultData */, reason,
+ false /* oomAdj */);
+ });
}
}
@@ -1383,50 +1341,43 @@ class Task extends WindowContainer<ActivityRecord> implements ConfigurationConta
* @return Returns the old activity that should be continued to be used,
* or {@code null} if none was found.
*/
- final ActivityRecord performClearTaskLocked(ActivityRecord newR, int launchFlags) {
- int numActivities = getChildCount();
- for (int activityNdx = numActivities - 1; activityNdx >= 0; --activityNdx) {
- ActivityRecord r = getChildAt(activityNdx);
- if (r.finishing) {
- continue;
+ private ActivityRecord performClearTaskLocked(ActivityRecord newR, int launchFlags) {
+ final ActivityRecord r = findActivityInHistory(newR.mActivityComponent);
+ if (r == null) return null;
+
+ final PooledFunction f = PooledLambda.obtainFunction(Task::finishActivityAbove,
+ PooledLambda.__(ActivityRecord.class), r);
+ forAllActivities(f);
+ f.recycle();
+
+ // Finally, if this is a normal launch mode (that is, not expecting onNewIntent()), then we
+ // will finish the current instance of the activity so a new fresh one can be started.
+ if (r.launchMode == ActivityInfo.LAUNCH_MULTIPLE
+ && (launchFlags & Intent.FLAG_ACTIVITY_SINGLE_TOP) == 0
+ && !ActivityStarter.isDocumentLaunchesIntoExisting(launchFlags)) {
+ if (!r.finishing) {
+ r.finishIfPossible("clear-task-top", false /* oomAdj */);
+ return null;
}
- if (r.mActivityComponent.equals(newR.mActivityComponent)) {
- // Here it is! Now finish everything in front...
- final ActivityRecord ret = r;
-
- for (++activityNdx; activityNdx < numActivities; ++activityNdx) {
- r = getChildAt(activityNdx);
- if (r.finishing) {
- continue;
- }
- ActivityOptions opts = r.takeOptionsLocked(false /* fromClient */);
- if (opts != null) {
- ret.updateOptionsLocked(opts);
- }
- if (r.finishIfPossible("clear-task-stack", false /* oomAdj */)
- == FINISH_RESULT_REMOVED) {
- --activityNdx;
- --numActivities;
- }
- }
+ }
- // Finally, if this is a normal launch mode (that is, not
- // expecting onNewIntent()), then we will finish the current
- // instance of the activity so a new fresh one can be started.
- if (ret.launchMode == ActivityInfo.LAUNCH_MULTIPLE
- && (launchFlags & Intent.FLAG_ACTIVITY_SINGLE_TOP) == 0
- && !ActivityStarter.isDocumentLaunchesIntoExisting(launchFlags)) {
- if (!ret.finishing) {
- ret.finishIfPossible("clear-task-top", false /* oomAdj */);
- return null;
- }
- }
+ return r;
+ }
- return ret;
+ private static boolean finishActivityAbove(ActivityRecord r, ActivityRecord boundaryActivity) {
+ // Stop operation once we reach the boundary activity.
+ if (r == boundaryActivity) return true;
+
+ if (!r.finishing) {
+ final ActivityOptions opts = r.takeOptionsLocked(false /* fromClient */);
+ if (opts != null) {
+ // TODO: Why is this updating the boundary activity vs. the current activity???
+ boundaryActivity.updateOptionsLocked(opts);
}
+ r.finishIfPossible("clear-task-stack", false /* oomAdj */);
}
- return null;
+ return false;
}
void removeTaskActivitiesLocked(String reason) {
@@ -1537,140 +1488,83 @@ class Task extends WindowContainer<ActivityRecord> implements ConfigurationConta
* Find the activity in the history stack within the given task. Returns
* the index within the history at which it's found, or < 0 if not found.
*/
- final ActivityRecord findActivityInHistoryLocked(ActivityRecord r) {
- final ComponentName realActivity = r.mActivityComponent;
- for (int activityNdx = getChildCount() - 1; activityNdx >= 0; --activityNdx) {
- ActivityRecord candidate = getChildAt(activityNdx);
- if (candidate.finishing) {
- continue;
- }
- if (candidate.mActivityComponent.equals(realActivity)) {
- return candidate;
- }
- }
- return null;
+ ActivityRecord findActivityInHistory(ComponentName component) {
+ final PooledPredicate p = PooledLambda.obtainPredicate(Task::matchesActivityInHistory,
+ PooledLambda.__(ActivityRecord.class), component);
+ final ActivityRecord r = getActivity(p);
+ p.recycle();
+ return r;
+ }
+
+ private static boolean matchesActivityInHistory(
+ ActivityRecord r, ComponentName activityComponent) {
+ return !r.finishing && r.mActivityComponent.equals(activityComponent);
}
/** Updates the last task description values. */
void updateTaskDescription() {
- // TODO(AM refactor): Cleanup to use findRootIndex()
- // Traverse upwards looking for any break between main task activities and
- // utility activities.
- int activityNdx;
- final int numActivities = getChildCount();
- final boolean relinquish = numActivities != 0
- && (getChildAt(0).info.flags & FLAG_RELINQUISH_TASK_IDENTITY) != 0;
- for (activityNdx = Math.min(numActivities, 1); activityNdx < numActivities; ++activityNdx) {
- final ActivityRecord r = getChildAt(activityNdx);
- if (relinquish && (r.info.flags & FLAG_RELINQUISH_TASK_IDENTITY) == 0) {
- // This will be the top activity for determining taskDescription. Pre-inc to
- // overcome initial decrement below.
- ++activityNdx;
- break;
+ final ActivityRecord root = getRootActivity(true);
+ if (root == null) return;
+
+ final TaskDescription taskDescription = new TaskDescription();
+ final PooledFunction f = PooledLambda.obtainFunction(
+ Task::setTaskDescriptionFromActivityAboveRoot,
+ PooledLambda.__(ActivityRecord.class), root, taskDescription);
+ forAllActivities(f);
+ f.recycle();
+ taskDescription.setResizeMode(mResizeMode);
+ taskDescription.setMinWidth(mMinWidth);
+ taskDescription.setMinHeight(mMinHeight);
+ setTaskDescription(taskDescription);
+ // Update the task affiliation color if we are the parent of the group
+ if (mTaskId == mAffiliatedTaskId) {
+ mAffiliatedTaskColor = taskDescription.getPrimaryColor();
+ }
+ mAtmService.getTaskChangeNotificationController().notifyTaskDescriptionChanged(
+ getTaskInfo());
+ }
+
+ private static boolean setTaskDescriptionFromActivityAboveRoot(
+ ActivityRecord r, ActivityRecord root, TaskDescription td) {
+ if (!r.mTaskOverlay && r.taskDescription != null) {
+ final TaskDescription atd = r.taskDescription;
+ if (td.getLabel() == null) {
+ td.setLabel(atd.getLabel());
}
- if (r.intent != null
- && (r.intent.getFlags() & Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET) != 0) {
- break;
+ if (td.getIconResource() == 0) {
+ td.setIcon(atd.getIconResource());
}
- }
- if (activityNdx > 0) {
- // Traverse downwards starting below break looking for set label, icon.
- // Note that if there are activities in the task but none of them set the
- // recent activity values, then we do not fall back to the last set
- // values in the Task.
- String label = null;
- String iconFilename = null;
- int iconResource = -1;
- int colorPrimary = 0;
- int colorBackground = 0;
- int statusBarColor = 0;
- int navigationBarColor = 0;
- boolean statusBarContrastWhenTransparent = false;
- boolean navigationBarContrastWhenTransparent = false;
- boolean topActivity = true;
- for (--activityNdx; activityNdx >= 0; --activityNdx) {
- final ActivityRecord r = getChildAt(activityNdx);
- if (r.mTaskOverlay) {
- continue;
- }
- if (r.taskDescription != null) {
- if (label == null) {
- label = r.taskDescription.getLabel();
- }
- if (iconResource == -1) {
- iconResource = r.taskDescription.getIconResource();
- }
- if (iconFilename == null) {
- iconFilename = r.taskDescription.getIconFilename();
- }
- if (colorPrimary == 0) {
- colorPrimary = r.taskDescription.getPrimaryColor();
- }
- if (topActivity) {
- colorBackground = r.taskDescription.getBackgroundColor();
- statusBarColor = r.taskDescription.getStatusBarColor();
- navigationBarColor = r.taskDescription.getNavigationBarColor();
- statusBarContrastWhenTransparent =
- r.taskDescription.getEnsureStatusBarContrastWhenTransparent();
- navigationBarContrastWhenTransparent =
- r.taskDescription.getEnsureNavigationBarContrastWhenTransparent();
- }
- }
- topActivity = false;
+ if (td.getIconFilename() == null) {
+ td.setIconFilename(atd.getIconFilename());
}
- final TaskDescription taskDescription = new TaskDescription(label, null, iconResource,
- iconFilename, colorPrimary, colorBackground, statusBarColor, navigationBarColor,
- statusBarContrastWhenTransparent, navigationBarContrastWhenTransparent,
- mResizeMode, mMinWidth, mMinHeight);
- setTaskDescription(taskDescription);
- // Update the task affiliation color if we are the parent of the group
- if (mTaskId == mAffiliatedTaskId) {
- mAffiliatedTaskColor = taskDescription.getPrimaryColor();
+ if (td.getPrimaryColor() == 0) {
+ td.setPrimaryColor(atd.getPrimaryColor());
}
- mAtmService.getTaskChangeNotificationController().notifyTaskDescriptionChanged(
- getTaskInfo());
- }
- }
-
- /**
- * Find the index of the root activity in the task. It will be the first activity from the
- * bottom that is not finishing.
- *
- * @param effectiveRoot Flag indicating whether 'effective root' should be returned - an
- * activity that defines the task identity (its base intent). It's the
- * first one that does not have
- * {@link ActivityInfo#FLAG_RELINQUISH_TASK_IDENTITY}.
- * @return index of the 'root' or 'effective' root in the list of activities, -1 if no eligible
- * activity was found.
- */
- int findRootIndex(boolean effectiveRoot) {
- int effectiveNdx = -1;
- final int topActivityNdx = getChildCount() - 1;
- for (int activityNdx = 0; activityNdx <= topActivityNdx; ++activityNdx) {
- final ActivityRecord r = getChildAt(activityNdx);
- if (r.finishing) {
- continue;
+ if (td.getBackgroundColor() == 0) {
+ td.setBackgroundColor(atd.getBackgroundColor());
}
- effectiveNdx = activityNdx;
- if (!effectiveRoot || (r.info.flags & FLAG_RELINQUISH_TASK_IDENTITY) == 0) {
- break;
+ if (td.getStatusBarColor() == 0) {
+ td.setStatusBarColor(atd.getStatusBarColor());
+ td.setEnsureStatusBarContrastWhenTransparent(
+ atd.getEnsureStatusBarContrastWhenTransparent());
}
+ if (td.getNavigationBarColor() == 0) {
+ td.setNavigationBarColor(atd.getNavigationBarColor());
+ td.setEnsureNavigationBarContrastWhenTransparent(
+ atd.getEnsureNavigationBarContrastWhenTransparent());
+ }
+
}
- return effectiveNdx;
+
+ // End search once we get to root.
+ return r == root;
}
// TODO (AM refactor): Invoke automatically when there is a change in children
@VisibleForTesting
void updateEffectiveIntent() {
- int effectiveRootIndex = findRootIndex(true /* effectiveRoot */);
- if (effectiveRootIndex == -1) {
- // All activities in the task are either finishing or relinquish task identity.
- // But we still want to update the intent, so let's use the bottom activity.
- effectiveRootIndex = 0;
- }
- final ActivityRecord r = getChildAt(effectiveRootIndex);
- setIntent(r);
-
+ final ActivityRecord root = getRootActivity(true /*setToBottomIfNone*/);
+ setIntent(root);
// Update the task description when the activities change
updateTaskDescription();
}
@@ -2220,15 +2114,6 @@ class Task extends WindowContainer<ActivityRecord> implements ConfigurationConta
return mLastNonFullscreenBounds;
}
- void addStartingWindowsForVisibleActivities(boolean taskSwitch) {
- for (int activityNdx = getChildCount() - 1; activityNdx >= 0; --activityNdx) {
- final ActivityRecord r = getChildAt(activityNdx);
- if (r.mVisibleRequested) {
- r.showStartingWindow(null /* prev */, false /* newTask */, taskSwitch);
- }
- }
- }
-
void setRootProcess(WindowProcessController proc) {
clearRootProcess();
if (intent != null
@@ -2245,12 +2130,6 @@ class Task extends WindowContainer<ActivityRecord> implements ConfigurationConta
}
}
- void clearAllPendingOptions() {
- for (int i = getChildCount() - 1; i >= 0; i--) {
- getChildAt(i).clearOptionsLocked(false /* withAbort */);
- }
- }
-
@Override
DisplayContent getDisplayContent() {
return getTaskStack() != null ? getTaskStack().getDisplayContent() : null;
@@ -2260,20 +2139,14 @@ class Task extends WindowContainer<ActivityRecord> implements ConfigurationConta
return (ActivityStack) getParent();
}
+ // TODO(task-hierarchy): Needs to take a generic WindowManager when task contains other tasks.
int getAdjustedAddPosition(ActivityRecord r, int suggestedPosition) {
int maxPosition = mChildren.size();
if (!r.mTaskOverlay) {
// We want to place all non-overlay activities below overlays.
- while (maxPosition > 0) {
- final ActivityRecord current = mChildren.get(maxPosition - 1);
- if (current.mTaskOverlay) {
- --maxPosition;
- continue;
- }
- break;
- }
- if (maxPosition < 0) {
- maxPosition = 0;
+ final ActivityRecord bottomMostOverlay = getActivity((ar) -> ar.mTaskOverlay, false);
+ if (bottomMostOverlay != null) {
+ maxPosition = Math.max(mChildren.indexOf(bottomMostOverlay) - 1, 0);
}
}
@@ -2281,18 +2154,13 @@ class Task extends WindowContainer<ActivityRecord> implements ConfigurationConta
}
@Override
- void positionChildAt(int position, ActivityRecord child, boolean includingParents) {
- position = getAdjustedAddPosition(child, position);
+ void positionChildAt(int position, WindowContainer child, boolean includingParents) {
+ position = getAdjustedAddPosition((ActivityRecord) child, position);
super.positionChildAt(position, child, includingParents);
}
private boolean hasWindowsAlive() {
- for (int i = mChildren.size() - 1; i >= 0; i--) {
- if (mChildren.get(i).hasWindowsAlive()) {
- return true;
- }
- }
- return false;
+ return getActivity(ActivityRecord::hasWindowsAlive) != null;
}
@VisibleForTesting
@@ -2522,26 +2390,21 @@ class Task extends WindowContainer<ActivityRecord> implements ConfigurationConta
* @param out Rect containing the max visible bounds.
* @return true if the task has some visible app windows; false otherwise.
*/
- private boolean getMaxVisibleBounds(Rect out) {
- boolean foundTop = false;
- for (int i = mChildren.size() - 1; i >= 0; i--) {
- final ActivityRecord token = mChildren.get(i);
- // skip hidden (or about to hide) apps
- if (token.mIsExiting || !token.isClientVisible() || !token.mVisibleRequested) {
- continue;
- }
- final WindowState win = token.findMainWindow();
- if (win == null) {
- continue;
- }
- if (!foundTop) {
- foundTop = true;
- out.setEmpty();
- }
-
- win.getMaxVisibleBounds(out);
+ private static void getMaxVisibleBounds(ActivityRecord token, Rect out, boolean[] foundTop) {
+ // skip hidden (or about to hide) apps
+ if (token.mIsExiting || !token.isClientVisible() || !token.mVisibleRequested) {
+ return;
+ }
+ final WindowState win = token.findMainWindow();
+ if (win == null) {
+ return;
+ }
+ if (!foundTop[0]) {
+ foundTop[0] = true;
+ out.setEmpty();
}
- return foundTop;
+
+ win.getMaxVisibleBounds(out);
}
/** Bounds of the task to be used for dimming, as well as touch related tests. */
@@ -2551,8 +2414,14 @@ class Task extends WindowContainer<ActivityRecord> implements ConfigurationConta
// a DimLayer anyway if we weren't visible.
final boolean dockedResizing = displayContent != null
&& displayContent.mDividerControllerLocked.isResizing();
- if (inFreeformWindowingMode() && getMaxVisibleBounds(out)) {
- return;
+ if (inFreeformWindowingMode()) {
+ boolean[] foundTop = { false };
+ final PooledConsumer c = PooledLambda.obtainConsumer(Task::getMaxVisibleBounds,
+ PooledLambda.__(ActivityRecord.class), out, foundTop);
+ c.recycle();
+ if (foundTop[0]) {
+ return;
+ }
}
if (!matchParentBounds()) {
@@ -2658,8 +2527,9 @@ class Task extends WindowContainer<ActivityRecord> implements ConfigurationConta
}
boolean showForAllUsers() {
- final int tokensCount = mChildren.size();
- return (tokensCount != 0) && mChildren.get(tokensCount - 1).mShowForAllUsers;
+ if (mChildren.isEmpty()) return false;
+ final ActivityRecord r = getTopNonFinishingActivity();
+ return r != null && r.mShowForAllUsers;
}
/**
@@ -2733,24 +2603,17 @@ class Task extends WindowContainer<ActivityRecord> implements ConfigurationConta
}
ActivityRecord getTopFullscreenActivity() {
- for (int i = mChildren.size() - 1; i >= 0; i--) {
- final ActivityRecord activity = mChildren.get(i);
- final WindowState win = activity.findMainWindow();
- if (win != null && win.mAttrs.isFullscreen()) {
- return activity;
- }
- }
- return null;
+ return getActivity((r) -> {
+ final WindowState win = r.findMainWindow();
+ return (win != null && win.mAttrs.isFullscreen());
+ });
}
ActivityRecord getTopVisibleActivity() {
- for (int i = mChildren.size() - 1; i >= 0; i--) {
- final ActivityRecord activity = mChildren.get(i);
- if (!activity.mIsExiting && activity.isClientVisible() && activity.mVisibleRequested) {
- return activity;
- }
- }
- return null;
+ return getActivity((r) -> {
+ // skip hidden (or about to hide) apps
+ return !r.mIsExiting && r.isClientVisible() && r.mVisibleRequested;
+ });
}
void positionChildAtTop(ActivityRecord child) {
@@ -2806,6 +2669,13 @@ class Task extends WindowContainer<ActivityRecord> implements ConfigurationConta
return callback.apply(this);
}
+ @Override
+ Task getTask(Predicate<Task> callback, boolean traverseTopToBottom) {
+ // I'm a task!
+ // TODO(task-hierarchy): Change to traverse children when tasks can contain other tasks.
+ return callback.test(this) ? this : null;
+ }
+
/**
* @param canAffectSystemUiFlags If false, all windows in this task can not affect SystemUI
* flags. See {@link WindowState#canAffectSystemUiFlags()}.
@@ -2861,10 +2731,9 @@ class Task extends WindowContainer<ActivityRecord> implements ConfigurationConta
final long token = proto.start(fieldId);
super.writeToProto(proto, WINDOW_CONTAINER, logLevel);
proto.write(TaskProto.ID, mTaskId);
- for (int i = mChildren.size() - 1; i >= 0; i--) {
- final ActivityRecord activity = mChildren.get(i);
- activity.writeToProto(proto, APP_WINDOW_TOKENS, logLevel);
- }
+ forAllActivities((r) -> {
+ r.writeToProto(proto, APP_WINDOW_TOKENS, logLevel);
+ });
proto.write(FILLS_PARENT, matchParentBounds());
getBounds().writeToProto(proto, TaskProto.BOUNDS);
mOverrideDisplayedBounds.writeToProto(proto, DISPLAYED_BOUNDS);
@@ -2888,11 +2757,11 @@ class Task extends WindowContainer<ActivityRecord> implements ConfigurationConta
final String triplePrefix = doublePrefix + " ";
final String quadruplePrefix = triplePrefix + " ";
- for (int i = mChildren.size() - 1; i >= 0; i--) {
- final ActivityRecord activity = mChildren.get(i);
- pw.println(triplePrefix + "Activity #" + i + " " + activity);
- activity.dump(pw, quadruplePrefix, dumpAll);
- }
+ int[] index = { 0 };
+ forAllActivities((r) -> {
+ pw.println(triplePrefix + "Activity #" + index[0]++ + " " + r);
+ r.dump(pw, quadruplePrefix, dumpAll);
+ });
}
/**
@@ -3071,10 +2940,10 @@ class Task extends WindowContainer<ActivityRecord> implements ConfigurationConta
final long token = proto.start(fieldId);
writeToProtoInnerTaskOnly(proto, TASK, logLevel);
proto.write(com.android.server.am.TaskRecordProto.ID, mTaskId);
- for (int i = getChildCount() - 1; i >= 0; i--) {
- final ActivityRecord activity = getChildAt(i);
- activity.writeToProto(proto, ACTIVITIES);
- }
+
+ forAllActivities((r) -> {
+ r.writeToProto(proto, ACTIVITIES);
+ });
proto.write(STACK_ID, getStackId());
if (mLastNonFullscreenBounds != null) {
mLastNonFullscreenBounds.writeToProto(proto, LAST_NON_FULLSCREEN_BOUNDS);
@@ -3100,7 +2969,7 @@ class Task extends WindowContainer<ActivityRecord> implements ConfigurationConta
}
/** @see #getNumRunningActivities(TaskActivitiesReport) */
- static class TaskActivitiesReport {
+ static class TaskActivitiesReport implements Consumer<ActivityRecord> {
int numRunning;
int numActivities;
ActivityRecord top;
@@ -3110,12 +2979,35 @@ class Task extends WindowContainer<ActivityRecord> implements ConfigurationConta
numRunning = numActivities = 0;
top = base = null;
}
+
+ @Override
+ public void accept(ActivityRecord r) {
+ if (r.finishing) {
+ return;
+ }
+
+ base = r;
+
+ // Increment the total number of non-finishing activities
+ numActivities++;
+
+ if (top == null || (top.isState(ActivityState.INITIALIZING))) {
+ top = r;
+ // Reset the number of running activities until we hit the first non-initializing
+ // activity
+ numRunning = 0;
+ }
+ if (r.attachedToProcess()) {
+ // Increment the number of actually running activities
+ numRunning++;
+ }
+ }
}
/**
* Saves this {@link Task} to XML using given serializer.
*/
- void saveToXml(XmlSerializer out) throws IOException, XmlPullParserException {
+ void saveToXml(XmlSerializer out) throws Exception {
if (DEBUG_RECENTS) Slog.i(TAG_RECENTS, "Saving task=" + this);
out.attribute(null, ATTR_TASKID, String.valueOf(mTaskId));
@@ -3181,19 +3073,33 @@ class Task extends WindowContainer<ActivityRecord> implements ConfigurationConta
out.endTag(null, TAG_INTENT);
}
- final int numActivities = getChildCount();
- for (int activityNdx = 0; activityNdx < numActivities; ++activityNdx) {
- final ActivityRecord r = getChildAt(activityNdx);
- if (r.info.persistableMode == ActivityInfo.PERSIST_ROOT_ONLY || !r.isPersistable()
- || ((r.intent.getFlags() & FLAG_ACTIVITY_NEW_DOCUMENT
- | FLAG_ACTIVITY_RETAIN_IN_RECENTS) == FLAG_ACTIVITY_NEW_DOCUMENT)
- && activityNdx > 0) {
- // Stop at first non-persistable or first break in task (CLEAR_WHEN_TASK_RESET).
- break;
- }
+ sTmpException = null;
+ final PooledFunction f = PooledLambda.obtainFunction(Task::saveActivityToXml,
+ PooledLambda.__(ActivityRecord.class), getBottomMostActivity(), out);
+ forAllActivities(f);
+ f.recycle();
+ if (sTmpException != null) {
+ throw sTmpException;
+ }
+ }
+
+ private static boolean saveActivityToXml(
+ ActivityRecord r, ActivityRecord first, XmlSerializer out) {
+ if (r.info.persistableMode == ActivityInfo.PERSIST_ROOT_ONLY || !r.isPersistable()
+ || ((r.intent.getFlags() & FLAG_ACTIVITY_NEW_DOCUMENT
+ | FLAG_ACTIVITY_RETAIN_IN_RECENTS) == FLAG_ACTIVITY_NEW_DOCUMENT)
+ && r != first) {
+ // Stop at first non-persistable or first break in task (CLEAR_WHEN_TASK_RESET).
+ return true;
+ }
+ try {
out.startTag(null, TAG_ACTIVITY);
r.saveToXml(out);
out.endTag(null, TAG_ACTIVITY);
+ return false;
+ } catch (Exception e) {
+ sTmpException = e;
+ return true;
}
}
diff --git a/services/core/java/com/android/server/wm/TaskPersister.java b/services/core/java/com/android/server/wm/TaskPersister.java
index 1e2f0d094944..eb130a1570cb 100644
--- a/services/core/java/com/android/server/wm/TaskPersister.java
+++ b/services/core/java/com/android/server/wm/TaskPersister.java
@@ -514,7 +514,7 @@ public class TaskPersister implements PersisterQueue.Listener {
mService = service;
}
- private StringWriter saveToXml(Task task) throws IOException, XmlPullParserException {
+ private StringWriter saveToXml(Task task) throws Exception {
if (DEBUG) Slog.d(TAG, "saveToXml: task=" + task);
final XmlSerializer xmlSerializer = new FastXmlSerializer();
StringWriter stringWriter = new StringWriter();
@@ -550,8 +550,7 @@ public class TaskPersister implements PersisterQueue.Listener {
try {
if (DEBUG) Slog.d(TAG, "Saving task=" + task);
stringWriter = saveToXml(task);
- } catch (IOException e) {
- } catch (XmlPullParserException e) {
+ } catch (Exception e) {
}
}
}
diff --git a/services/core/java/com/android/server/wm/TaskSnapshotCache.java b/services/core/java/com/android/server/wm/TaskSnapshotCache.java
index d07516a6c86d..5cbab5d1b1f5 100644
--- a/services/core/java/com/android/server/wm/TaskSnapshotCache.java
+++ b/services/core/java/com/android/server/wm/TaskSnapshotCache.java
@@ -48,9 +48,9 @@ class TaskSnapshotCache {
if (entry != null) {
mAppTaskMap.remove(entry.topApp);
}
- final ActivityRecord top = task.getTopChild();
+ final ActivityRecord top = task.getTopMostActivity();
mAppTaskMap.put(top, task.mTaskId);
- mRunningCache.put(task.mTaskId, new CacheEntry(snapshot, task.getTopChild()));
+ mRunningCache.put(task.mTaskId, new CacheEntry(snapshot, top));
}
/**
diff --git a/services/core/java/com/android/server/wm/TaskSnapshotController.java b/services/core/java/com/android/server/wm/TaskSnapshotController.java
index f83ceb0bfc4e..c1a36c49fc1a 100644
--- a/services/core/java/com/android/server/wm/TaskSnapshotController.java
+++ b/services/core/java/com/android/server/wm/TaskSnapshotController.java
@@ -235,23 +235,18 @@ class TaskSnapshotController {
* children, which should be ignored.
*/
@Nullable private ActivityRecord findAppTokenForSnapshot(Task task) {
- for (int i = task.getChildCount() - 1; i >= 0; --i) {
- final ActivityRecord activity = task.getChildAt(i);
- if (activity == null || !activity.isSurfaceShowing()
- || activity.findMainWindow() == null) {
- continue;
+ return task.getActivity((r) -> {
+ if (r == null || !r.isSurfaceShowing() || r.findMainWindow() == null) {
+ return false;
}
- final boolean hasVisibleChild = activity.forAllWindows(
+ return r.forAllWindows(
// Ensure at least one window for the top app is visible before attempting to
// take a screenshot. Visible here means that the WSA surface is shown and has
// an alpha greater than 0.
ws -> ws.mWinAnimator != null && ws.mWinAnimator.getShown()
&& ws.mWinAnimator.mLastAlpha > 0f, true /* traverseTopToBottom */);
- if (hasVisibleChild) {
- return activity;
- }
- }
- return null;
+
+ });
}
@Nullable
@@ -380,7 +375,7 @@ class TaskSnapshotController {
@VisibleForTesting
int getSnapshotMode(Task task) {
- final ActivityRecord topChild = task.getTopChild();
+ final ActivityRecord topChild = task.getTopMostActivity();
if (!task.isActivityTypeStandardOrUndefined() && !task.isActivityTypeAssistant()) {
return SNAPSHOT_MODE_NONE;
} else if (topChild != null && topChild.shouldUseAppThemeSnapshot()) {
@@ -395,7 +390,7 @@ class TaskSnapshotController {
* as possible by using the theme's window background.
*/
private TaskSnapshot drawAppThemeSnapshot(Task task) {
- final ActivityRecord topChild = task.getTopChild();
+ final ActivityRecord topChild = task.getTopMostActivity();
if (topChild == null) {
return null;
}
diff --git a/services/core/java/com/android/server/wm/WindowContainer.java b/services/core/java/com/android/server/wm/WindowContainer.java
index 453514b2f46e..5c1491e3ac38 100644
--- a/services/core/java/com/android/server/wm/WindowContainer.java
+++ b/services/core/java/com/android/server/wm/WindowContainer.java
@@ -310,6 +310,10 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer<
final protected void setParent(WindowContainer<WindowContainer> parent) {
final WindowContainer oldParent = mParent;
mParent = parent;
+
+ if (mParent != null) {
+ mParent.onChildAdded(this);
+ }
if (!mReparenting) {
onParentChanged(mParent, oldParent);
}
@@ -389,7 +393,6 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer<
} else {
mChildren.add(positionToAdd, child);
}
- onChildAdded(child);
// Set the parent after we've actually added a child in case a subclass depends on this.
child.setParent(this);
@@ -418,7 +421,6 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer<
}
mChildren.add(index, child);
- onChildAdded(child);
// Set the parent after we've actually added a child in case a subclass depends on this.
child.setParent(this);
@@ -1096,11 +1098,22 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer<
}
boolean forAllActivities(Function<ActivityRecord, Boolean> callback) {
- for (int i = mChildren.size() - 1; i >= 0; --i) {
- if (mChildren.get(i).forAllActivities(callback)) {
- return true;
+ return forAllActivities(callback, true /*traverseTopToBottom*/);
+ }
+
+ boolean forAllActivities(
+ Function<ActivityRecord, Boolean> callback, boolean traverseTopToBottom) {
+ if (traverseTopToBottom) {
+ for (int i = mChildren.size() - 1; i >= 0; --i) {
+ if (mChildren.get(i).forAllActivities(callback, traverseTopToBottom)) return true;
+ }
+ } else {
+ final int count = mChildren.size();
+ for (int i = 0; i < count; i++) {
+ if (mChildren.get(i).forAllActivities(callback, traverseTopToBottom)) return true;
}
}
+
return false;
}
@@ -1121,6 +1134,61 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer<
}
}
+ /**
+ * Process all activities in this branch of the tree.
+ *
+ * @param callback Called for each activity found.
+ * @param boundary We don't return activities via {@param callback} until we get to this node in
+ * the tree.
+ * @param includeBoundary If the boundary from be processed to return activities.
+ * @param traverseTopToBottom direction to traverse the tree.
+ * @return {@code true} if we ended the search before reaching the end of the tree.
+ */
+ final boolean forAllActivities(Function<ActivityRecord, Boolean> callback,
+ WindowContainer boundary, boolean includeBoundary, boolean traverseTopToBottom) {
+ return forAllActivities(
+ callback, boundary, includeBoundary, traverseTopToBottom, new boolean[1]);
+ }
+
+ private boolean forAllActivities(Function<ActivityRecord, Boolean> callback,
+ WindowContainer boundary, boolean includeBoundary, boolean traverseTopToBottom,
+ boolean[] boundaryFound) {
+ if (traverseTopToBottom) {
+ for (int i = mChildren.size() - 1; i >= 0; --i) {
+ if (processForAllActivitiesWithBoundary(callback, boundary, includeBoundary,
+ traverseTopToBottom, boundaryFound, mChildren.get(i))) {
+ return true;
+ }
+ }
+ } else {
+ final int count = mChildren.size();
+ for (int i = 0; i < count; i++) {
+ if (processForAllActivitiesWithBoundary(callback, boundary, includeBoundary,
+ traverseTopToBottom, boundaryFound, mChildren.get(i))) {
+ return true;
+ }
+ }
+ }
+
+ return false;
+ }
+
+ private boolean processForAllActivitiesWithBoundary(Function<ActivityRecord, Boolean> callback,
+ WindowContainer boundary, boolean includeBoundary, boolean traverseTopToBottom,
+ boolean[] boundaryFound, WindowContainer wc) {
+ if (wc == boundary) {
+ boundaryFound[0] = true;
+ if (!includeBoundary) return false;
+ }
+
+ if (boundaryFound[0]) {
+ return wc.forAllActivities(callback, traverseTopToBottom);
+ }
+
+ return wc.forAllActivities(
+ callback, boundary, includeBoundary, traverseTopToBottom, boundaryFound);
+ }
+
/** @return {@code true} if this node or any of its children contains an activity. */
boolean hasActivity() {
for (int i = mChildren.size() - 1; i >= 0; --i) {
@@ -1156,6 +1224,81 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer<
return null;
}
+ /**
+ * Gets an activity in a branch of the tree.
+ *
+ * @param callback called to test if this is the activity that should be returned.
+ * @param boundary We don't return activities via {@param callback} until we get to this node in
+ * the tree.
+ * @param includeBoundary If the boundary from be processed to return activities.
+ * @param traverseTopToBottom direction to traverse the tree.
+ * @return The activity if found or null.
+ */
+ final ActivityRecord getActivity(Predicate<ActivityRecord> callback,
+ WindowContainer boundary, boolean includeBoundary, boolean traverseTopToBottom) {
+ return getActivity(
+ callback, boundary, includeBoundary, traverseTopToBottom, new boolean[1]);
+ }
+
+ private ActivityRecord getActivity(Predicate<ActivityRecord> callback,
+ WindowContainer boundary, boolean includeBoundary, boolean traverseTopToBottom,
+ boolean[] boundaryFound) {
+ if (traverseTopToBottom) {
+ for (int i = mChildren.size() - 1; i >= 0; --i) {
+ final ActivityRecord r = processGetActivityWithBoundary(callback, boundary,
+ includeBoundary, traverseTopToBottom, boundaryFound, mChildren.get(i));
+ if (r != null) {
+ return r;
+ }
+ }
+ } else {
+ final int count = mChildren.size();
+ for (int i = 0; i < count; i++) {
+ final ActivityRecord r = processGetActivityWithBoundary(callback, boundary,
+ includeBoundary, traverseTopToBottom, boundaryFound, mChildren.get(i));
+ if (r != null) {
+ return r;
+ }
+ }
+ }
+
+ return null;
+ }
+
+ private ActivityRecord processGetActivityWithBoundary(Predicate<ActivityRecord> callback,
+ WindowContainer boundary, boolean includeBoundary, boolean traverseTopToBottom,
+ boolean[] boundaryFound, WindowContainer wc) {
+ if (wc == boundary || boundary == null) {
+ boundaryFound[0] = true;
+ if (!includeBoundary) return null;
+ }
+
+ if (boundaryFound[0]) {
+ return wc.getActivity(callback, traverseTopToBottom);
+ }
+
+ return wc.getActivity(
+ callback, boundary, includeBoundary, traverseTopToBottom, boundaryFound);
+ }
+
+ ActivityRecord getActivityAbove(ActivityRecord r) {
+ return getActivity((above) -> true, r,
+ false /*includeBoundary*/, false /*traverseTopToBottom*/);
+ }
+
+ ActivityRecord getActivityBelow(ActivityRecord r) {
+ return getActivity((below) -> true, r,
+ false /*includeBoundary*/, true /*traverseTopToBottom*/);
+ }
+
+ ActivityRecord getBottomMostActivity() {
+ return getActivity((r) -> true, false /*traverseTopToBottom*/);
+ }
+
+ ActivityRecord getTopMostActivity() {
+ return getActivity((r) -> true, true /*traverseTopToBottom*/);
+ }
+
ActivityRecord getTopActivity(boolean includeFinishing, boolean includeOverlays) {
// Break down into 4 calls to avoid object creation due to capturing input params.
if (includeFinishing) {
@@ -1187,6 +1330,31 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer<
}
}
+ Task getTask(Predicate<Task> callback) {
+ return getTask(callback, true /*traverseTopToBottom*/);
+ }
+
+ Task getTask(Predicate<Task> callback, boolean traverseTopToBottom) {
+ if (traverseTopToBottom) {
+ for (int i = mChildren.size() - 1; i >= 0; --i) {
+ final Task t = mChildren.get(i).getTask(callback, traverseTopToBottom);
+ if (t != null) {
+ return t;
+ }
+ }
+ } else {
+ final int count = mChildren.size();
+ for (int i = 0; i < count; i++) {
+ final Task t = mChildren.get(i).getTask(callback, traverseTopToBottom);
+ if (t != null) {
+ return t;
+ }
+ }
+ }
+
+ return null;
+ }
+
/**
* For all tasks at or below this container call the callback.
*
diff --git a/services/core/java/com/android/server/wm/WindowProcessController.java b/services/core/java/com/android/server/wm/WindowProcessController.java
index c1783efbffb3..e169037abd2b 100644
--- a/services/core/java/com/android/server/wm/WindowProcessController.java
+++ b/services/core/java/com/android/server/wm/WindowProcessController.java
@@ -722,11 +722,10 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio
return true;
}
- ArraySet<Task> getReleaseSomeActivitiesTasks() {
+ void releaseSomeActivities(String reason) {
// Examine all activities currently running in the process.
- Task firstTask = null;
- // Tasks is non-null only if two or more tasks are found.
- ArraySet<Task> tasks = null;
+ // Candidate activities that can be destroyed.
+ ArrayList<ActivityRecord> candidates = null;
if (DEBUG_RELEASE) Slog.d(TAG_RELEASE, "Trying to release some activities in " + this);
for (int i = 0; i < mActivities.size(); i++) {
final ActivityRecord r = mActivities.get(i);
@@ -735,33 +734,37 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio
// down before we try to prune more activities.
if (r.finishing || r.isState(DESTROYING, DESTROYED)) {
if (DEBUG_RELEASE) Slog.d(TAG_RELEASE, "Abort release; already destroying: " + r);
- return null;
+ return;
}
// Don't consider any activities that are currently not in a state where they
// can be destroyed.
- if (r.mVisibleRequested || !r.stopped || !r.hasSavedState()
+ if (r.mVisibleRequested || !r.stopped || !r.hasSavedState() || !r.isDestroyable()
|| r.isState(STARTED, RESUMED, PAUSING, PAUSED, STOPPING)) {
if (DEBUG_RELEASE) Slog.d(TAG_RELEASE, "Not releasing in-use activity: " + r);
continue;
}
- final Task task = r.getTask();
- if (task != null) {
- if (DEBUG_RELEASE) Slog.d(TAG_RELEASE, "Collecting release task " + task
- + " from " + r);
- if (firstTask == null) {
- firstTask = task;
- } else if (firstTask != task) {
- if (tasks == null) {
- tasks = new ArraySet<>();
- tasks.add(firstTask);
- }
- tasks.add(task);
+ if (r.getParent() != null) {
+ if (candidates == null) {
+ candidates = new ArrayList<>();
}
+ candidates.add(r);
}
}
- return tasks;
+ if (candidates != null) {
+ // Sort based on z-order in hierarchy.
+ candidates.sort(WindowContainer::compareTo);
+ // Release some older activities
+ int maxRelease = Math.max(candidates.size(), 1);
+ do {
+ final ActivityRecord r = candidates.remove(0);
+ if (DEBUG_RELEASE) Slog.v(TAG_RELEASE, "Destroying " + r
+ + " in state " + r.getState() + " for reason " + reason);
+ r.destroyImmediately(true /*removeFromApp*/, reason);
+ --maxRelease;
+ } while (maxRelease > 0);
+ }
}
public interface ComputeOomAdjCallback {
diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java
index b1b386b3f489..c2b8827df8a3 100644
--- a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java
@@ -914,7 +914,7 @@ public class ActivityRecordTests extends ActivityTestsBase {
// Add another stack to become focused and make the activity there visible. This way it
// simulates finishing in non-focused stack in split-screen.
final ActivityStack stack = new StackBuilder(mRootActivityContainer).build();
- final ActivityRecord focusedActivity = stack.getChildAt(0).getChildAt(0);
+ final ActivityRecord focusedActivity = stack.getTopMostActivity();
focusedActivity.nowVisible = true;
focusedActivity.mVisibleRequested = true;
focusedActivity.setState(RESUMED, "test");
diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityStackTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityStackTests.java
index ba5485904ee6..c8795cec3508 100644
--- a/services/tests/wmtests/src/com/android/server/wm/ActivityStackTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ActivityStackTests.java
@@ -241,7 +241,7 @@ public class ActivityStackTests extends ActivityTestsBase {
final RootActivityContainer.FindTaskResult result =
new RootActivityContainer.FindTaskResult();
- mStack.findTaskLocked(r, result);
+ result.process(r, mStack);
assertEquals(r, task.getTopNonFinishingActivity(false /* includeOverlays */));
assertEquals(taskOverlay, task.getTopNonFinishingActivity(true /* includeOverlays */));
@@ -266,14 +266,14 @@ public class ActivityStackTests extends ActivityTestsBase {
final ActivityRecord r1 = new ActivityBuilder(mService).setComponent(
target).setTargetActivity(targetActivity).build();
RootActivityContainer.FindTaskResult result = new RootActivityContainer.FindTaskResult();
- mStack.findTaskLocked(r1, result);
+ result.process(r1, mStack);
assertThat(result.mRecord).isNotNull();
// Using alias activity to find task.
final ActivityRecord r2 = new ActivityBuilder(mService).setComponent(
alias).setTargetActivity(targetActivity).build();
result = new RootActivityContainer.FindTaskResult();
- mStack.findTaskLocked(r2, result);
+ result.process(r2, mStack);
assertThat(result.mRecord).isNotNull();
}
@@ -846,9 +846,9 @@ public class ActivityStackTests extends ActivityTestsBase {
mStack.mResumedActivity = secondActivity;
// Note the activities have non-null ActivityRecord.app, so it won't remove directly.
- mStack.finishDisabledPackageActivitiesLocked(firstActivity.packageName,
- null /* filterByClasses */, true /* doit */, true /* evenPersistent */,
- UserHandle.USER_ALL);
+ mRootActivityContainer.mFinishDisabledPackageActivitiesHelper.process(
+ firstActivity.packageName, null /* filterByClasses */, true /* doit */,
+ true /* evenPersistent */, UserHandle.USER_ALL);
// If the activity is disabled with {@link android.content.pm.PackageManager#DONT_KILL_APP}
// the activity should still follow the normal flow to finish and destroy.
@@ -875,9 +875,9 @@ public class ActivityStackTests extends ActivityTestsBase {
assertEquals(2, mTask.getChildCount());
- mStack.finishDisabledPackageActivitiesLocked(activity.packageName,
- null /* filterByClasses */, true /* doit */, true /* evenPersistent */,
- UserHandle.USER_ALL);
+ mRootActivityContainer.mFinishDisabledPackageActivitiesHelper.process(
+ activity.packageName, null /* filterByClasses */, true /* doit */,
+ true /* evenPersistent */, UserHandle.USER_ALL);
// Although the overlay activity is in another package, the non-overlay activities are
// removed from the task. Since the overlay activity should be removed as well, the task
diff --git a/services/tests/wmtests/src/com/android/server/wm/RootActivityContainerTests.java b/services/tests/wmtests/src/com/android/server/wm/RootActivityContainerTests.java
index e2bdf874c3e6..425724921ada 100644
--- a/services/tests/wmtests/src/com/android/server/wm/RootActivityContainerTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/RootActivityContainerTests.java
@@ -73,6 +73,7 @@ import org.junit.runner.RunWith;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
+import java.util.function.Consumer;
/**
* Tests for the {@link RootActivityContainer} class.
@@ -149,9 +150,7 @@ public class RootActivityContainerTests extends ActivityTestsBase {
final Task task = stack.getAllTasks().get(0);
final ArrayList<ActivityRecord> stackActivities = new ArrayList<>();
- for (int i = 0; i < task.getChildCount(); i++) {
- stackActivities.add(task.getChildAt(i));
- }
+ task.forAllActivities((Consumer<ActivityRecord>) stackActivities::add, false);
assertEquals("Expecting " + Arrays.deepToString(activities) + " got " + stackActivities,
stackActivities.size(), activities != null ? activities.length : 0);
diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskRecordTests.java b/services/tests/wmtests/src/com/android/server/wm/TaskRecordTests.java
index c8f81f4a84c2..d756f9a650e3 100644
--- a/services/tests/wmtests/src/com/android/server/wm/TaskRecordTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/TaskRecordTests.java
@@ -471,8 +471,9 @@ public class TaskRecordTests extends ActivityTestsBase {
// Add an extra activity on top of the root one
new ActivityBuilder(mService).setTask(task).build();
- assertEquals("The root activity in the task must be reported.",
- 0, task.findRootIndex(false /* effectiveRoot*/));
+ assertEquals("The root activity in the task must be reported.", task.getChildAt(0),
+ task.getRootActivity(
+ true /*ignoreRelinquishIdentity*/, true /*setToBottomIfNone*/));
}
/**
@@ -483,14 +484,15 @@ public class TaskRecordTests extends ActivityTestsBase {
public void testFindRootIndex_finishing() {
final Task task = getTestTask();
// Add extra two activities and mark the two on the bottom as finishing.
- final ActivityRecord activity0 = task.getChildAt(0);
+ final ActivityRecord activity0 = task.getBottomMostActivity();
activity0.finishing = true;
final ActivityRecord activity1 = new ActivityBuilder(mService).setTask(task).build();
activity1.finishing = true;
new ActivityBuilder(mService).setTask(task).build();
assertEquals("The first non-finishing activity in the task must be reported.",
- 2, task.findRootIndex(false /* effectiveRoot*/));
+ task.getChildAt(2), task.getRootActivity(
+ true /*ignoreRelinquishIdentity*/, true /*setToBottomIfNone*/));
}
/**
@@ -504,7 +506,8 @@ public class TaskRecordTests extends ActivityTestsBase {
new ActivityBuilder(mService).setTask(task).build();
assertEquals("The root activity in the task must be reported.",
- 0, task.findRootIndex(true /* effectiveRoot*/));
+ task.getChildAt(0), task.getRootActivity(
+ false /*ignoreRelinquishIdentity*/, true /*setToBottomIfNone*/));
}
/**
@@ -516,14 +519,15 @@ public class TaskRecordTests extends ActivityTestsBase {
final Task task = getTestTask();
// Add extra two activities. Mark the one on the bottom with "relinquishTaskIdentity" and
// one above as finishing.
- final ActivityRecord activity0 = task.getChildAt(0);
+ final ActivityRecord activity0 = task.getBottomMostActivity();
activity0.info.flags |= FLAG_RELINQUISH_TASK_IDENTITY;
final ActivityRecord activity1 = new ActivityBuilder(mService).setTask(task).build();
activity1.finishing = true;
new ActivityBuilder(mService).setTask(task).build();
assertEquals("The first non-finishing activity and non-relinquishing task identity "
- + "must be reported.", 2, task.findRootIndex(true /* effectiveRoot*/));
+ + "must be reported.", task.getChildAt(2), task.getRootActivity(
+ false /*ignoreRelinquishIdentity*/, true /*setToBottomIfNone*/));
}
/**
@@ -534,10 +538,11 @@ public class TaskRecordTests extends ActivityTestsBase {
public void testFindRootIndex_effectiveRoot_relinquishingAndSingleActivity() {
final Task task = getTestTask();
// Set relinquishTaskIdentity for the only activity in the task
- task.getChildAt(0).info.flags |= FLAG_RELINQUISH_TASK_IDENTITY;
+ task.getBottomMostActivity().info.flags |= FLAG_RELINQUISH_TASK_IDENTITY;
assertEquals("The root activity in the task must be reported.",
- 0, task.findRootIndex(true /* effectiveRoot*/));
+ task.getChildAt(0), task.getRootActivity(
+ false /*ignoreRelinquishIdentity*/, true /*setToBottomIfNone*/));
}
/**
@@ -548,13 +553,14 @@ public class TaskRecordTests extends ActivityTestsBase {
public void testFindRootIndex_effectiveRoot_relinquishingMultipleActivities() {
final Task task = getTestTask();
// Set relinquishTaskIdentity for all activities in the task
- final ActivityRecord activity0 = task.getChildAt(0);
+ final ActivityRecord activity0 = task.getBottomMostActivity();
activity0.info.flags |= FLAG_RELINQUISH_TASK_IDENTITY;
final ActivityRecord activity1 = new ActivityBuilder(mService).setTask(task).build();
activity1.info.flags |= FLAG_RELINQUISH_TASK_IDENTITY;
assertEquals("The topmost activity in the task must be reported.",
- task.getChildCount() - 1, task.findRootIndex(true /* effectiveRoot*/));
+ task.getChildAt(task.getChildCount() - 1), task.getRootActivity(
+ false /*ignoreRelinquishIdentity*/, true /*setToBottomIfNone*/));
}
/** Test that bottom-most activity is reported in {@link Task#getRootActivity()}. */
@@ -565,7 +571,7 @@ public class TaskRecordTests extends ActivityTestsBase {
new ActivityBuilder(mService).setTask(task).build();
assertEquals("The root activity in the task must be reported.",
- task.getChildAt(0), task.getRootActivity());
+ task.getBottomMostActivity(), task.getRootActivity());
}
/**
@@ -577,7 +583,7 @@ public class TaskRecordTests extends ActivityTestsBase {
// Add an extra activity on top of the root one
new ActivityBuilder(mService).setTask(task).build();
// Mark the root as finishing
- task.getChildAt(0).finishing = true;
+ task.getBottomMostActivity().finishing = true;
assertEquals("The first non-finishing activity in the task must be reported.",
task.getChildAt(1), task.getRootActivity());
@@ -590,13 +596,13 @@ public class TaskRecordTests extends ActivityTestsBase {
public void testGetRootActivity_relinquishTaskIdentity() {
final Task task = getTestTask();
// Mark the bottom-most activity with FLAG_RELINQUISH_TASK_IDENTITY.
- final ActivityRecord activity0 = task.getChildAt(0);
+ final ActivityRecord activity0 = task.getBottomMostActivity();
activity0.info.flags |= FLAG_RELINQUISH_TASK_IDENTITY;
// Add an extra activity on top of the root one.
new ActivityBuilder(mService).setTask(task).build();
assertEquals("The root activity in the task must be reported.",
- task.getChildAt(0), task.getRootActivity());
+ task.getBottomMostActivity(), task.getRootActivity());
}
/**
@@ -607,7 +613,7 @@ public class TaskRecordTests extends ActivityTestsBase {
public void testGetRootActivity_allFinishing() {
final Task task = getTestTask();
// Mark the bottom-most activity as finishing.
- final ActivityRecord activity0 = task.getChildAt(0);
+ final ActivityRecord activity0 = task.getBottomMostActivity();
activity0.finishing = true;
// Add an extra activity on top of the root one and mark it as finishing
final ActivityRecord activity1 = new ActivityBuilder(mService).setTask(task).build();
@@ -623,7 +629,7 @@ public class TaskRecordTests extends ActivityTestsBase {
public void testIsRootActivity() {
final Task task = getTestTask();
// Mark the bottom-most activity as finishing.
- final ActivityRecord activity0 = task.getChildAt(0);
+ final ActivityRecord activity0 = task.getBottomMostActivity();
activity0.finishing = true;
// Add an extra activity on top of the root one.
final ActivityRecord activity1 = new ActivityBuilder(mService).setTask(task).build();
@@ -640,7 +646,7 @@ public class TaskRecordTests extends ActivityTestsBase {
public void testIsRootActivity_allFinishing() {
final Task task = getTestTask();
// Mark the bottom-most activity as finishing.
- final ActivityRecord activity0 = task.getChildAt(0);
+ final ActivityRecord activity0 = task.getBottomMostActivity();
activity0.finishing = true;
// Add an extra activity on top of the root one and mark it as finishing
final ActivityRecord activity1 = new ActivityBuilder(mService).setTask(task).build();
@@ -657,10 +663,10 @@ public class TaskRecordTests extends ActivityTestsBase {
@Test
public void testGetTaskForActivity() {
final Task task0 = getTestTask();
- final ActivityRecord activity0 = task0.getChildAt(0);
+ final ActivityRecord activity0 = task0.getBottomMostActivity();
final Task task1 = getTestTask();
- final ActivityRecord activity1 = task1.getChildAt(0);
+ final ActivityRecord activity1 = task1.getBottomMostActivity();
assertEquals(task0.mTaskId,
ActivityRecord.getTaskForActivityLocked(activity0.appToken, false /* onlyRoot */));
@@ -676,7 +682,7 @@ public class TaskRecordTests extends ActivityTestsBase {
public void testGetTaskForActivity_onlyRoot_finishing() {
final Task task = getTestTask();
// Make the current root activity finishing
- final ActivityRecord activity0 = task.getChildAt(0);
+ final ActivityRecord activity0 = task.getBottomMostActivity();
activity0.finishing = true;
// Add an extra activity on top - this will be the new root
final ActivityRecord activity1 = new ActivityBuilder(mService).setTask(task).build();
@@ -699,7 +705,7 @@ public class TaskRecordTests extends ActivityTestsBase {
public void testGetTaskForActivity_onlyRoot_relinquishTaskIdentity() {
final Task task = getTestTask();
// Make the current root activity relinquish task identity
- final ActivityRecord activity0 = task.getChildAt(0);
+ final ActivityRecord activity0 = task.getBottomMostActivity();
activity0.info.flags |= FLAG_RELINQUISH_TASK_IDENTITY;
// Add an extra activity on top - this will be the new root
final ActivityRecord activity1 = new ActivityBuilder(mService).setTask(task).build();
@@ -722,7 +728,7 @@ public class TaskRecordTests extends ActivityTestsBase {
public void testGetTaskForActivity_notOnlyRoot() {
final Task task = getTestTask();
// Mark the bottom-most activity as finishing.
- final ActivityRecord activity0 = task.getChildAt(0);
+ final ActivityRecord activity0 = task.getBottomMostActivity();
activity0.finishing = true;
// Add an extra activity on top of the root one and make it relinquish task identity
@@ -747,7 +753,7 @@ public class TaskRecordTests extends ActivityTestsBase {
public void testUpdateEffectiveIntent() {
// Test simple case with a single activity.
final Task task = getTestTask();
- final ActivityRecord activity0 = task.getChildAt(0);
+ final ActivityRecord activity0 = task.getBottomMostActivity();
spyOn(task);
task.updateEffectiveIntent();
@@ -762,7 +768,7 @@ public class TaskRecordTests extends ActivityTestsBase {
public void testUpdateEffectiveIntent_rootFinishing() {
// Test simple case with a single activity.
final Task task = getTestTask();
- final ActivityRecord activity0 = task.getChildAt(0);
+ final ActivityRecord activity0 = task.getBottomMostActivity();
// Mark the bottom-most activity as finishing.
activity0.finishing = true;
// Add an extra activity on top of the root one
@@ -782,7 +788,7 @@ public class TaskRecordTests extends ActivityTestsBase {
public void testUpdateEffectiveIntent_allFinishing() {
// Test simple case with a single activity.
final Task task = getTestTask();
- final ActivityRecord activity0 = task.getChildAt(0);
+ final ActivityRecord activity0 = task.getBottomMostActivity();
// Mark the bottom-most activity as finishing.
activity0.finishing = true;
// Add an extra activity on top of the root one and make it relinquish task identity
@@ -818,7 +824,7 @@ public class TaskRecordTests extends ActivityTestsBase {
task.getResolvedOverrideConfiguration().windowConfiguration.getAppBounds());
}
- private byte[] serializeToBytes(Task r) throws IOException, XmlPullParserException {
+ private byte[] serializeToBytes(Task r) throws Exception {
try (ByteArrayOutputStream os = new ByteArrayOutputStream()) {
final XmlSerializer serializer = Xml.newSerializer();
serializer.setOutput(os, "UTF-8");
diff --git a/wifi/java/android/net/wifi/WifiActivityEnergyInfo.java b/wifi/java/android/net/wifi/WifiActivityEnergyInfo.java
index 0f7fc2d48b7d..f0f31fae0aeb 100644
--- a/wifi/java/android/net/wifi/WifiActivityEnergyInfo.java
+++ b/wifi/java/android/net/wifi/WifiActivityEnergyInfo.java
@@ -16,10 +16,14 @@
package android.net.wifi;
+import android.annotation.IntDef;
+import android.annotation.NonNull;
+import android.annotation.SystemApi;
import android.os.Parcel;
import android.os.Parcelable;
-import java.util.Arrays;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
/**
* Record of energy and activity information from controller and
@@ -27,179 +31,197 @@ import java.util.Arrays;
* real-time.
* @hide
*/
+@SystemApi
public final class WifiActivityEnergyInfo implements Parcelable {
- /**
- * @hide
- */
- public long mTimestamp;
-
- /**
- * @hide
- */
- public int mStackState;
-
- /**
- * @hide
- */
- public long mControllerTxTimeMs;
-
- /**
- * @hide
- */
- public long[] mControllerTxTimePerLevelMs;
-
- /**
- * @hide
- */
- public long mControllerRxTimeMs;
-
- /**
- * @hide
- */
- public long mControllerScanTimeMs;
-
- /**
- * @hide
- */
- public long mControllerIdleTimeMs;
-
- /**
- * @hide
- */
- public long mControllerEnergyUsed;
-
+ private long mTimeSinceBootMillis;
+ @StackState
+ private int mStackState;
+ private long mControllerTxDurationMillis;
+ private long mControllerRxDurationMillis;
+ private long mControllerScanDurationMillis;
+ private long mControllerIdleDurationMillis;
+ private long mControllerEnergyUsedMicroJoules;
+
+ /** @hide */
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef(prefix = {"STACK_STATE_"}, value = {
+ STACK_STATE_INVALID,
+ STACK_STATE_STATE_ACTIVE,
+ STACK_STATE_STATE_SCANNING,
+ STACK_STATE_STATE_IDLE})
+ public @interface StackState {}
+
+ /** Invalid Wifi stack state. */
public static final int STACK_STATE_INVALID = 0;
+ /** Wifi stack is active. */
public static final int STACK_STATE_STATE_ACTIVE = 1;
+ /** Wifi stack is scanning. */
public static final int STACK_STATE_STATE_SCANNING = 2;
+ /** Wifi stack is idle. */
public static final int STACK_STATE_STATE_IDLE = 3;
- public WifiActivityEnergyInfo(long timestamp, int stackState,
- long txTime, long[] txTimePerLevel, long rxTime, long scanTime,
- long idleTime, long energyUsed) {
- mTimestamp = timestamp;
+ /**
+ * Constructor.
+ *
+ * @param timeSinceBootMillis the time since boot, in milliseconds.
+ * @param stackState The current state of the Wifi Stack. One of {@link #STACK_STATE_INVALID},
+ * {@link #STACK_STATE_STATE_ACTIVE}, {@link #STACK_STATE_STATE_SCANNING},
+ * or {@link #STACK_STATE_STATE_IDLE}.
+ * @param txDurationMillis Cumulative milliseconds of active transmission.
+ * @param rxDurationMillis Cumulative milliseconds of active receive.
+ * @param scanDurationMillis Cumulative milliseconds when radio is awake due to scan.
+ * @param idleDurationMillis Cumulative milliseconds when radio is awake but not transmitting or
+ * receiving.
+ * @param energyUsedMicroJoules Cumulative energy consumed by Wifi, in microjoules.
+ */
+ public WifiActivityEnergyInfo(
+ long timeSinceBootMillis,
+ @StackState int stackState,
+ long txDurationMillis,
+ long rxDurationMillis,
+ long scanDurationMillis,
+ long idleDurationMillis,
+ long energyUsedMicroJoules) {
+ mTimeSinceBootMillis = timeSinceBootMillis;
mStackState = stackState;
- mControllerTxTimeMs = txTime;
- mControllerTxTimePerLevelMs = txTimePerLevel;
- mControllerRxTimeMs = rxTime;
- mControllerScanTimeMs = scanTime;
- mControllerIdleTimeMs = idleTime;
- mControllerEnergyUsed = energyUsed;
+ mControllerTxDurationMillis = txDurationMillis;
+ mControllerRxDurationMillis = rxDurationMillis;
+ mControllerScanDurationMillis = scanDurationMillis;
+ mControllerIdleDurationMillis = idleDurationMillis;
+ mControllerEnergyUsedMicroJoules = energyUsedMicroJoules;
}
@Override
public String toString() {
return "WifiActivityEnergyInfo{"
- + " timestamp=" + mTimestamp
- + " mStackState=" + mStackState
- + " mControllerTxTimeMs=" + mControllerTxTimeMs
- + " mControllerTxTimePerLevelMs=" + Arrays.toString(mControllerTxTimePerLevelMs)
- + " mControllerRxTimeMs=" + mControllerRxTimeMs
- + " mControllerScanTimeMs=" + mControllerScanTimeMs
- + " mControllerIdleTimeMs=" + mControllerIdleTimeMs
- + " mControllerEnergyUsed=" + mControllerEnergyUsed
- + " }";
- }
-
- public static final @android.annotation.NonNull Parcelable.Creator<WifiActivityEnergyInfo> CREATOR =
+ + " mTimeSinceBootMillis=" + mTimeSinceBootMillis
+ + " mStackState=" + mStackState
+ + " mControllerTxDurationMillis=" + mControllerTxDurationMillis
+ + " mControllerRxDurationMillis=" + mControllerRxDurationMillis
+ + " mControllerScanDurationMillis=" + mControllerScanDurationMillis
+ + " mControllerIdleDurationMillis=" + mControllerIdleDurationMillis
+ + " mControllerEnergyUsedMicroJoules=" + mControllerEnergyUsedMicroJoules
+ + " }";
+ }
+
+ public static final @NonNull Parcelable.Creator<WifiActivityEnergyInfo> CREATOR =
new Parcelable.Creator<WifiActivityEnergyInfo>() {
public WifiActivityEnergyInfo createFromParcel(Parcel in) {
long timestamp = in.readLong();
int stackState = in.readInt();
long txTime = in.readLong();
- long[] txTimePerLevel = in.createLongArray();
long rxTime = in.readLong();
long scanTime = in.readLong();
long idleTime = in.readLong();
long energyUsed = in.readLong();
return new WifiActivityEnergyInfo(timestamp, stackState,
- txTime, txTimePerLevel, rxTime, scanTime, idleTime, energyUsed);
+ txTime, rxTime, scanTime, idleTime, energyUsed);
}
public WifiActivityEnergyInfo[] newArray(int size) {
return new WifiActivityEnergyInfo[size];
}
};
- public void writeToParcel(Parcel out, int flags) {
- out.writeLong(mTimestamp);
+ @Override
+ public void writeToParcel(@NonNull Parcel out, int flags) {
+ out.writeLong(mTimeSinceBootMillis);
out.writeInt(mStackState);
- out.writeLong(mControllerTxTimeMs);
- out.writeLongArray(mControllerTxTimePerLevelMs);
- out.writeLong(mControllerRxTimeMs);
- out.writeLong(mControllerScanTimeMs);
- out.writeLong(mControllerIdleTimeMs);
- out.writeLong(mControllerEnergyUsed);
+ out.writeLong(mControllerTxDurationMillis);
+ out.writeLong(mControllerRxDurationMillis);
+ out.writeLong(mControllerScanDurationMillis);
+ out.writeLong(mControllerIdleDurationMillis);
+ out.writeLong(mControllerEnergyUsedMicroJoules);
}
+ @Override
public int describeContents() {
return 0;
}
+ /** Get the timestamp (milliseconds since boot) of record creation. */
+ public long getTimeSinceBootMillis() {
+ return mTimeSinceBootMillis;
+ }
+
+ /** Set the timestamp (milliseconds since boot) of record creation. */
+ public void setTimeSinceBootMillis(long timeSinceBootMillis) {
+ mTimeSinceBootMillis = timeSinceBootMillis;
+ }
+
/**
- * @return bt stack reported state
+ * Get the Wifi stack reported state. One of {@link #STACK_STATE_INVALID},
+ * {@link #STACK_STATE_STATE_ACTIVE}, {@link #STACK_STATE_STATE_SCANNING},
+ * {@link #STACK_STATE_STATE_IDLE}.
*/
+ @StackState
public int getStackState() {
return mStackState;
}
/**
- * @return tx time in ms
+ * Set the Wifi stack reported state. One of {@link #STACK_STATE_INVALID},
+ * {@link #STACK_STATE_STATE_ACTIVE}, {@link #STACK_STATE_STATE_SCANNING},
+ * {@link #STACK_STATE_STATE_IDLE}.
*/
- public long getControllerTxTimeMillis() {
- return mControllerTxTimeMs;
+ public void setStackState(@StackState int stackState) {
+ mStackState = stackState;
}
- /**
- * @return tx time at power level provided in ms
- */
- public long getControllerTxTimeMillisAtLevel(int level) {
- if (level < mControllerTxTimePerLevelMs.length) {
- return mControllerTxTimePerLevelMs[level];
- }
- return 0;
+ /** Get the Wifi transmission duration, in milliseconds. */
+ public long getControllerTxDurationMillis() {
+ return mControllerTxDurationMillis;
}
- /**
- * @return rx time in ms
- */
- public long getControllerRxTimeMillis() {
- return mControllerRxTimeMs;
+ /** Set the Wifi transmission duration, in milliseconds. */
+ public void setControllerTxDurationMillis(long controllerTxDurationMillis) {
+ mControllerTxDurationMillis = controllerTxDurationMillis;
}
- /**
- * @return scan time in ms
- */
- public long getControllerScanTimeMillis() {
- return mControllerScanTimeMs;
+ /** Get the Wifi receive duration, in milliseconds. */
+ public long getControllerRxDurationMillis() {
+ return mControllerRxDurationMillis;
}
- /**
- * @return idle time in ms
- */
- public long getControllerIdleTimeMillis() {
- return mControllerIdleTimeMs;
+ /** Set the Wifi receive duration, in milliseconds. */
+ public void setControllerRxDurationMillis(long controllerRxDurationMillis) {
+ mControllerRxDurationMillis = controllerRxDurationMillis;
}
- /**
- * product of current(mA), voltage(V) and time(ms)
- * @return energy used
- */
- public long getControllerEnergyUsed() {
- return mControllerEnergyUsed;
+ /** Get the Wifi scan duration, in milliseconds. */
+ public long getControllerScanDurationMillis() {
+ return mControllerScanDurationMillis;
}
- /**
- * @return timestamp(wall clock) of record creation
- */
- public long getTimeStamp() {
- return mTimestamp;
+
+ /** Set the Wifi scan duration, in milliseconds. */
+ public void setControllerScanDurationMillis(long controllerScanDurationMillis) {
+ mControllerScanDurationMillis = controllerScanDurationMillis;
}
- /**
- * @return if the record is valid
- */
+ /** Get the Wifi idle duration, in milliseconds. */
+ public long getControllerIdleDurationMillis() {
+ return mControllerIdleDurationMillis;
+ }
+
+ /** Set the Wifi idle duration, in milliseconds. */
+ public void setControllerIdleDurationMillis(long controllerIdleDurationMillis) {
+ mControllerIdleDurationMillis = controllerIdleDurationMillis;
+ }
+
+ /** Get the energy consumed by Wifi, in microjoules. */
+ public long getControllerEnergyUsedMicroJoules() {
+ return mControllerEnergyUsedMicroJoules;
+ }
+
+ /** Set the energy consumed by Wifi, in microjoules. */
+ public void setControllerEnergyUsedMicroJoules(long controllerEnergyUsedMicroJoules) {
+ mControllerEnergyUsedMicroJoules = controllerEnergyUsedMicroJoules;
+ }
+
+ /** Returns true if the record is valid, false otherwise. */
public boolean isValid() {
- return ((mControllerTxTimeMs >=0) &&
- (mControllerRxTimeMs >=0) &&
- (mControllerScanTimeMs >=0) &&
- (mControllerIdleTimeMs >=0));
+ return mControllerTxDurationMillis >= 0
+ && mControllerRxDurationMillis >= 0
+ && mControllerScanDurationMillis >= 0
+ && mControllerIdleDurationMillis >= 0;
}
-} \ No newline at end of file
+}
diff --git a/wifi/java/android/net/wifi/hotspot2/OsuProvider.java b/wifi/java/android/net/wifi/hotspot2/OsuProvider.java
index 3bef50211015..f0a06076961c 100644
--- a/wifi/java/android/net/wifi/hotspot2/OsuProvider.java
+++ b/wifi/java/android/net/wifi/hotspot2/OsuProvider.java
@@ -19,7 +19,6 @@ package android.net.wifi.hotspot2;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.SystemApi;
-import android.graphics.drawable.Icon;
import android.net.Uri;
import android.net.wifi.WifiSsid;
import android.os.Bundle;
@@ -86,23 +85,16 @@ public final class OsuProvider implements Parcelable {
*/
private final List<Integer> mMethodList;
- /**
- * Icon data for the OSU (Online Sign-Up) provider.
- */
- private final Icon mIcon;
-
/** @hide */
public OsuProvider(String osuSsid, Map<String, String> friendlyNames,
- String serviceDescription, Uri serverUri, String nai, List<Integer> methodList,
- Icon icon) {
+ String serviceDescription, Uri serverUri, String nai, List<Integer> methodList) {
this(WifiSsid.createFromByteArray(osuSsid.getBytes(StandardCharsets.UTF_8)),
- friendlyNames, serviceDescription, serverUri, nai, methodList, icon);
+ friendlyNames, serviceDescription, serverUri, nai, methodList);
}
/** @hide */
public OsuProvider(WifiSsid osuSsid, Map<String, String> friendlyNames,
- String serviceDescription, Uri serverUri, String nai, List<Integer> methodList,
- Icon icon) {
+ String serviceDescription, Uri serverUri, String nai, List<Integer> methodList) {
mOsuSsid = osuSsid;
mFriendlyNames = friendlyNames;
mServiceDescription = serviceDescription;
@@ -113,7 +105,6 @@ public final class OsuProvider implements Parcelable {
} else {
mMethodList = new ArrayList<>(methodList);
}
- mIcon = icon;
}
/**
@@ -130,7 +121,6 @@ public final class OsuProvider implements Parcelable {
mServerUri = null;
mNetworkAccessIdentifier = null;
mMethodList = new ArrayList<>();
- mIcon = null;
return;
}
@@ -144,7 +134,6 @@ public final class OsuProvider implements Parcelable {
} else {
mMethodList = new ArrayList<>(source.mMethodList);
}
- mIcon = source.mIcon;
}
/** @hide */
@@ -205,11 +194,6 @@ public final class OsuProvider implements Parcelable {
return mMethodList;
}
- /** @hide */
- public Icon getIcon() {
- return mIcon;
- }
-
@Override
public int describeContents() {
return 0;
@@ -222,7 +206,6 @@ public final class OsuProvider implements Parcelable {
dest.writeParcelable(mServerUri, flags);
dest.writeString(mNetworkAccessIdentifier);
dest.writeList(mMethodList);
- dest.writeParcelable(mIcon, flags);
Bundle bundle = new Bundle();
bundle.putSerializable("friendlyNameMap", (HashMap<String, String>) mFriendlyNames);
dest.writeBundle(bundle);
@@ -237,21 +220,16 @@ public final class OsuProvider implements Parcelable {
return false;
}
OsuProvider that = (OsuProvider) thatObject;
- return (mOsuSsid == null ? that.mOsuSsid == null : mOsuSsid.equals(that.mOsuSsid))
- && (mFriendlyNames == null) ? that.mFriendlyNames == null
- : mFriendlyNames.equals(that.mFriendlyNames)
+ return Objects.equals(mOsuSsid, that.mOsuSsid)
+ && Objects.equals(mFriendlyNames, that.mFriendlyNames)
&& TextUtils.equals(mServiceDescription, that.mServiceDescription)
- && (mServerUri == null ? that.mServerUri == null
- : mServerUri.equals(that.mServerUri))
+ && Objects.equals(mServerUri, that.mServerUri)
&& TextUtils.equals(mNetworkAccessIdentifier, that.mNetworkAccessIdentifier)
- && (mMethodList == null ? that.mMethodList == null
- : mMethodList.equals(that.mMethodList))
- && (mIcon == null ? that.mIcon == null : mIcon.sameAs(that.mIcon));
+ && Objects.equals(mMethodList, that.mMethodList);
}
@Override
public int hashCode() {
- // mIcon is not hashable, skip the variable.
return Objects.hash(mOsuSsid, mServiceDescription, mFriendlyNames,
mServerUri, mNetworkAccessIdentifier, mMethodList);
}
@@ -264,8 +242,7 @@ public final class OsuProvider implements Parcelable {
+ " mServiceDescription=" + mServiceDescription
+ " mServerUri=" + mServerUri
+ " mNetworkAccessIdentifier=" + mNetworkAccessIdentifier
- + " mMethodList=" + mMethodList
- + " mIcon=" + mIcon;
+ + " mMethodList=" + mMethodList;
}
public static final @android.annotation.NonNull Creator<OsuProvider> CREATOR =
@@ -278,12 +255,11 @@ public final class OsuProvider implements Parcelable {
String nai = in.readString();
List<Integer> methodList = new ArrayList<>();
in.readList(methodList, null);
- Icon icon = in.readParcelable(null);
Bundle bundle = in.readBundle();
Map<String, String> friendlyNamesMap = (HashMap) bundle.getSerializable(
"friendlyNameMap");
return new OsuProvider(osuSsid, friendlyNamesMap, serviceDescription,
- serverUri, nai, methodList, icon);
+ serverUri, nai, methodList);
}
@Override
diff --git a/wifi/tests/src/android/net/wifi/WifiManagerTest.java b/wifi/tests/src/android/net/wifi/WifiManagerTest.java
index ab027b38348e..d22dbd3dbc43 100644
--- a/wifi/tests/src/android/net/wifi/WifiManagerTest.java
+++ b/wifi/tests/src/android/net/wifi/WifiManagerTest.java
@@ -1684,7 +1684,7 @@ public class WifiManagerTest {
@Test
public void testGetControllerActivityEnergyInfo() throws Exception {
WifiActivityEnergyInfo activityEnergyInfo =
- new WifiActivityEnergyInfo(5, 3, 3, new long[]{5L, 5L, 5L}, 5, 5, 5, 5);
+ new WifiActivityEnergyInfo(5, 3, 3, 5, 5, 5, 5);
when(mWifiService.reportActivityInfo()).thenReturn(activityEnergyInfo);
assertEquals(activityEnergyInfo, mWifiManager.getControllerActivityEnergyInfo());
diff --git a/wifi/tests/src/android/net/wifi/hotspot2/OsuProviderTest.java b/wifi/tests/src/android/net/wifi/hotspot2/OsuProviderTest.java
index 43ee24943e12..2ded849331d7 100644
--- a/wifi/tests/src/android/net/wifi/hotspot2/OsuProviderTest.java
+++ b/wifi/tests/src/android/net/wifi/hotspot2/OsuProviderTest.java
@@ -19,7 +19,6 @@ package android.net.wifi.hotspot2;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
-import android.graphics.drawable.Icon;
import android.net.Uri;
import android.net.wifi.WifiSsid;
import android.os.Parcel;
@@ -56,7 +55,6 @@ public class OsuProviderTest {
private static final String TEST_NAI = "test.access.com";
private static final List<Integer> TEST_METHOD_LIST =
Arrays.asList(OsuProvider.METHOD_SOAP_XML_SPP);
- private static final Icon TEST_ICON = Icon.createWithData(new byte[10], 0, 10);
/**
* Verify parcel write and read consistency for the given {@link OsuProvider}.
@@ -82,7 +80,7 @@ public class OsuProviderTest {
*/
@Test
public void verifyParcelWithEmptyProviderInfo() throws Exception {
- verifyParcel(new OsuProvider((WifiSsid) null, null, null, null, null, null, null));
+ verifyParcel(new OsuProvider((WifiSsid) null, null, null, null, null, null));
}
/**
@@ -93,7 +91,7 @@ public class OsuProviderTest {
@Test
public void verifyParcelWithFullProviderInfo() throws Exception {
verifyParcel(new OsuProvider(TEST_SSID, TEST_FRIENDLY_NAMES,
- TEST_SERVICE_DESCRIPTION, TEST_SERVER_URI, TEST_NAI, TEST_METHOD_LIST, TEST_ICON));
+ TEST_SERVICE_DESCRIPTION, TEST_SERVER_URI, TEST_NAI, TEST_METHOD_LIST));
}
/**
@@ -102,7 +100,7 @@ public class OsuProviderTest {
*/
@Test
public void verifyCopyConstructorWithNullSource() throws Exception {
- OsuProvider expected = new OsuProvider((WifiSsid) null, null, null, null, null, null, null);
+ OsuProvider expected = new OsuProvider((WifiSsid) null, null, null, null, null, null);
assertEquals(expected, new OsuProvider(null));
}
@@ -114,7 +112,7 @@ public class OsuProviderTest {
@Test
public void verifyCopyConstructorWithValidSource() throws Exception {
OsuProvider source = new OsuProvider(TEST_SSID, TEST_FRIENDLY_NAMES,
- TEST_SERVICE_DESCRIPTION, TEST_SERVER_URI, TEST_NAI, TEST_METHOD_LIST, TEST_ICON);
+ TEST_SERVICE_DESCRIPTION, TEST_SERVER_URI, TEST_NAI, TEST_METHOD_LIST);
assertEquals(source, new OsuProvider(source));
}
@@ -126,7 +124,7 @@ public class OsuProviderTest {
@Test
public void verifyGetters() throws Exception {
OsuProvider provider = new OsuProvider(TEST_SSID, TEST_FRIENDLY_NAMES,
- TEST_SERVICE_DESCRIPTION, TEST_SERVER_URI, TEST_NAI, TEST_METHOD_LIST, TEST_ICON);
+ TEST_SERVICE_DESCRIPTION, TEST_SERVER_URI, TEST_NAI, TEST_METHOD_LIST);
assertTrue(TEST_SSID.equals(provider.getOsuSsid()));
assertTrue(TEST_FRIENDLY_NAME.equals(provider.getFriendlyName()));
@@ -135,6 +133,5 @@ public class OsuProviderTest {
assertTrue(TEST_SERVER_URI.equals(provider.getServerUri()));
assertTrue(TEST_NAI.equals(provider.getNetworkAccessIdentifier()));
assertTrue(TEST_METHOD_LIST.equals(provider.getMethodList()));
- assertTrue(TEST_ICON.sameAs(provider.getIcon()));
}
}